很简单的一题,但是二分我还是有很多困惑,具体表现为除去标准的二分,我自己写的二分为啥老是有问题
int main() {
int n,m,h[1000004];
ll sum;
int l=0,mid,r;
cin>>n>>m;
for(int i=0;i<n;i++) {
cin>>h[i];
r=max(r,h[i]);
}
while(l<=r){
sum=0;
mid=(l+r)/2;
for(int i=0;i<n;i++)
if(h[i]>mid) sum+=h[i]-mid;
if(sum<m) r=mid-1;
else l=mid+1;
}
cout<<r;
return 0;
}
二分为啥一定要用l和r来做判断标志
为啥这样会超时
int l=0,mid=0,r=h[n-1];
while(sum!=m){
sum=0;
mid=(l+r+1)/2;
for(int i=0;i<n;i++)
if(h[i]>mid) sum+=h[i]-mid;
if(sum<m) r=mid-1;
if(sum>m) l=mid+1;
}
cout<<mid;
为啥会有些点ac不了
int l=0,mid=0,r=h[n-1];
while(l<=r){
sum=0;
mid=(l+r+1)/2;
for(int i=0;i<n;i++)
if(h[i]>mid) sum+=h[i]-mid;
if(sum<m) r=mid-1;
if(sum>m) l=mid+1;
if(sum==m) break;
}
cout<<mid;