moda
2024-12-15 14:10:55
发布于:浙江
0阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int main(){
/*1,答案区间[l,r]->[0,hight(树的最大值)]
2,ans(代表锯子在mid时,锯下的总和)
如果(ans>=m),记录mid,[l,r]->[mid+1,r]
否则,不记录mid,[l,r]->[l,mid-1]
*/
int n,m,num=0;
cin>>n>>m;
int l=0,r=0;//答案区间
for (int i=1;i<=n;i++) {
cin>>a[i];
r=max(r,a[i]);
}
//二分
while(l<=r){
int mid=(l+r)/2;
int ans=0;//ans(代表锯子在mid时,锯下的总和)
for (int i=1;i<=n;i++){
if(a[i]>mid) ans+=a[i]-mid;
}
if (ans>=m){//如果(ans>=m),记录mid,[l,r]->[mid+1,r]
l=mid+1;
num=mid;
}else{//否则,不记录mid,[l,r]->[l,mid-1]
r=mid-1;
}
}
cout<<num;
return 0;
}
这里空空如也
有帮助,赞一个