我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html

题目传送门:https://www.luogu.org/problemnew/show/P1873

我们可以二分高度\(high\)。显然对于能砍出\(m\)米木材的\(high\),任何小于\(high\)的高度都不会更优(因为米尔科只需要\(m\)米木材并且他十分关注生态保护)。那么\([1,high]\)这个区间就不是备选答案区间了,我们就应该到\([high,mx]\)里去找尽可能高的\(high\),使得当伐木机锯片在\(high\)米时可以砍下大于等于\(m\)的木材,而在\(high+1\)时必然小于\(m\)。

时间复杂度:\(O(nloga)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1e6+5; int a[maxn];
int n,mn,mx,m,ans; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} bool check(int high) {
long long res=0;
for(int i=1;i<=n;i++)
if(a[i]>high)res+=a[i]-high;
return res>=m;//计算high这个高度可以砍下多少木材并且判断是否满足要求
} int main() {
n=read(),m=read();mn=1,mx=-1e9;
for(int i=1;i<=n;i++)
a[i]=read(),mx=max(mx,a[i]);
int l=mn,r=mx;
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;//根据上述思路二分
}printf("%d\n",ans);
return 0;
}

最新文章

  1. HTML5知识点总结
  2. 贝叶斯网引论 by 张连文
  3. UVA 12299 RMQ with Shifts(线段树:单点更新)
  4. 【leetcode】Number of Islands(middle)
  5. js 所有事件列表
  6. 初用Ubuntu常见问题及解决方案之一
  7. ADO.NET 连接方式和非链接方式访问数据库
  8. 谈谈 React.js 的核心入门知识
  9. javascript的变量,传值和传址,参数之间关系
  10. ARP欺骗与中间人攻击
  11. Careercup - Facebook面试题 - 6026101998485504
  12. 今天晚上 中国互联网被Struts2漏洞血洗
  13. IOS 支付宝 SDK 申请
  14. struct 和 class 不同点
  15. webpack4配置详解之常用插件分享
  16. Web Application Vulnerablities
  17. C#闰年判断
  18. python中stack在实际中的简单应用之平衡符号
  19. Java开发人员必须掌握的Linux命令(二)
  20. 新装的MySQL没有密码怎么办

热门文章

  1. 6.2.3-Bean的加载处理
  2. [转]How Hash Algorithms Work
  3. Google的Guava之IO升华
  4. ubuntu sudo-update出错Encountered a section with no Package: header
  5. 3.26课&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;window.document对象
  6. iOS 流媒体 基本使用 和方法注意
  7. UI组件之Label
  8. ARM汇编学习笔记
  9. python 3 模块
  10. 某国际知名IT公司笔试