这题我们可以推出来是单调的 所有就可以用二分来写
check函数就是判断joker能不能补完缺少的和是否会造成有两个joker在一套牌里面
代码有详细注释
#include <bits/stdc++.h>
#define ll long long
const int N=55;
using namespace std;
ll n,m,a[N];
bool check(ll mid){
ll tmp=min(mid,m);///防止补的joker比套数还多 说明一套有两个joker
for(int i=1;i<=n;i++){
tmp-=max(mid-a[i],0ll);///小于套数的数要用joker来补
if(tmp<0) return 0;///joker不够补了
}
return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
ll l=1,r=1e9,ans;
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号