n个杯子,里面各有a[i]升水,问是否能从中倒出来s升水,如果不能输出-1,否则输出剩下的各个杯子水中最小的升数。
一开始不用脑子从最小的开始枚举,一直到0,果然TLE。
然后果断二分,就Ac啦
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,s,a[1010],sum,mim = 0x3f3f3f3f,l,r,mid,ans;
int can(LL x){
return (sum-n*x>=s?1:0);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
cin>>n>>s;
for(int i = 1;i<=n;i++) {
cin>>a[i];
sum += a[i];
mim = min(mim,a[i]);
}
if(sum<s) {
cout<<-1;return 0;
}
l = 0;r = mim;
while(l<=r){
mid = (l+r)>>1;// cout<<l<<' '<<r<<' '<<mid<<endl;
if(can(mid)) l = mid+1,ans = max(ans,mid);
else r = mid-1;
}
cout<<ans;
return 0;
}