这题我们可以推出来是单调的 所有就可以用二分来写
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; }