虚空终端 • 2年前
看来是我小看这道题了,最开始我用的暴力枚举,无论是正序还是倒序都超时 所以这题要用二分查找法,不然就会极其惨烈 不说别的了,上代码:
#include<iostream>
using namespace std;
const int N=1e6+5;
int n,m,ans,l=1,r;
int a[N];
bool check(int k){
long long d=0;
for (int i=1;i<=n;i++)
if (a[i]>k) d+=a[i]-k;
if (d>=m) return true;
return false;
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i];
if (a[i]>r) r=a[i];
}
while (l<=r){
int mid=(l+r)/2;
if (check(mid))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans;
return 0;
}
评论:
请先登录,才能进行评论