洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解
洛谷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;
}

浙公网安备 33010602011771号