改成longlong就过了
这题是找最大的,最初写成找最小的了,也就是r当答案了
AC Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f;
ll t[maxn],n,m;
bool solve(int mid) {
ll sum =0;
for(int i=0; i<n; i++) {
if(t[i] > mid)
sum+=(t[i] - mid);
}
return sum>=m;
}
int main() {
ll mmax=0;
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>t[i];
mmax = max(mmax,t[i]);
}
ll l=0,r=mmax,mid,ans = 0;
while(l<=r) {
mid = (r+l)/2;
if(!solve(mid))
r = mid-1;
else
l = mid+1 ;
}
cout<<l-1<<endl;
return 0;
}
Other
sort(h+1,h+n+1);
l=0;
r=h[n];
while (l+1<r)
{
ll maxn=0;
mid=(l+r)/2;
for (int i=1;i<=n;i++)
if (h[i]>mid) maxn=maxn+h[i]-mid;
if (maxn<m) r=mid;
else l=mid;
}
printf("%lld",l);