这道题又做了一遍,感觉思路清晰很多,做的比较顺畅,将要砍的高度二分。
还有一个要注意,数据如果不确定又不卡时间,开long long.
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int n,a[maxn],num;
ll m;
bool check(int x){
ll sum=0;
for(int i=1;i<=n;i++){
if(a[i]>x)
sum+=(a[i]-x);
}
if(sum>=m)
return true;
else return false;
}
int binary(int l,int r){
int mid,ans;
while(l<=r){
mid=l+(r-l)/2;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main(){
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
num=max(num,a[i]);
}
// cout<<num<<endl;
printf("%d\n",binary(0,num));
return 0;
}