第一次写出黄题,虽然借鉴了一下题解,但是茅塞顿开,对二分check判断条件的理解更加深刻了很有纪念意义的一题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll a[N];
ll n , m , maxn;
bool check(ll a[] , ll n , ll m , ll mid)//二分查找必备函数
{
ll cnt = 0;
for(int i = 0 ; i < n ; i++)
{
if(a[i]>mid) cnt += a[i] - mid;
}
return cnt >= m;
}
int main()
{
cin >> n >> m;
for(int i = 0 ; i< n ; i++)
{
cin >> a[i];
maxn = max(maxn,a[i]);//找到最大值作为区间的最大范围
}
ll l = 0 , r = maxn-1;//我要在(0,maxn-1)的范围内找到我的切割高度。
//也就是确定了找到目标的范围
//数的范围确定后就好办了
//直接二分模板,因为是找最大值,所以从右往左找,也就是模板l=mid的情况
while(l<r)
{
ll mid = l+r+1 >> 1;
if(check(a,n,m,mid)) l = mid ;
else r = mid - 1;
}
printf("%d",l);
return 0;
}