P1873砍树

思路:
二分答案
1.最优解
2.锯片的高度越高,获得的木材总数越少——单调性
向右找
1.初始化l=0(考虑有全部砍光的情形),r=max(h[i])
2.check函数判断当前锯片高度mid下,是否能得到M米的木材(遍历数组,计算差值即可)
3.记得开long long。
#define MAXN 1000005
using ll=long long;
ll n,m,h[MAXN],l,r,mid;
bool check(ll x){
ll cnt=0;
for(int i=1;i<=n;++i){
if(h[i]>x)
cnt+=h[i]-x;
}
return cnt>=m;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i){
scanf("%lld",&h[i]);
r=max(r,h[i]);
}
l=0;
while(l<r){
mid=(l+r+1)/2;
//cout<<"l,r,mid:"<<l<<","<<r<<","<<mid<<'\n';
if(check(mid))
l=mid;
else
r=mid-1;
}
cout<<r;
return 0;
}

浙公网安备 33010602011771号