洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解
题目传送门。
思路
我们可以使用二分答案法。
二分查找砍树的高度\(H\),每次使用\(check(long\ long\ x)\)函数用于检测在\(x\)米高度时是否可以砍到\(m\)米以上的木头。
\(check\)函数是用一个循环从1到\(n\),每次计数器\(sum\)加上0和\(h_i-x\)的最大值(因为不可能砍到负数米木头)。最后返回\(sum\le m\)。
在二分循环内,如果\(check\)函数返回true,则代表木头太多了,需要提高高度,所以要把\(l\)赋值为\(mid\),反之,返回false时,代表木头太少了,需要降低高度,所以要把\(r\)赋值为\(mid\)。
代码
#include<bits/stdc++.h>
#define endl '\n'using namespace std;int n;
long long m,t[1000005];
bool check(long long h){long long sum=0;for(int i=1;i<=n;i++){sum+=max(0ll,t[i]-h);}return sum>=m;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>t[i];int l=0,r=400001;while(l+1<r){int mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}cout<<l<<endl;return 0;
}