题解:本题主要考查二分。线段leftt=1、r=maxx取树的最大高度,check函数可以直接模拟一重循环加上树高(注意:值很大)
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
long long n,bz,s=0,mid,leftt,maxx;
long long a[100342508];
int main()
{
cin>>n>>bz;
for(int i=1;i<=n;i++)
{
cin>>a[i];
maxx=max(maxx,a[i]);
}
while(leftt<=maxx)
{
mid=(leftt+maxx)/2;//二分
s=0;
for(int i=1;i<=n;i++)
if(a[i]>mid)s=s+a[i]-mid;
if(s<bz)maxx=mid-1;
else leftt=mid+1;
}
cout<<leftt-1;
cin>>n;
return 0;
}