来练二分的,大佬帮看看check函数有问题吗
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[300010];
ll n, m;
bool check(ll mid)
{
ll sh = m;
for (ll i = 1; i < n; i++)
{
if (a[i] < mid)
{ // 如果最大值a[n-1]也小,应该操作
sh -= mid - a[i];
}
else
{
if (i != i - 1)
{
sh += a[i] - mid;
}
}
}
if (sh >= 0)
{
return true;
}
else
{
return false;
}
}
int main()
{
cin >> n >> m;
for (ll i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
ll l = a[1];
ll r = a[n - 1] + m;
while (l < r)
{
ll mid = (l + r + 1) / 2;
if (check(mid))
{
l = mid;
}
else
{
r = mid - 1;
}
}
cout << l * (n - 2);
return 0;
}