想了好久觉得这就应该是个贪心题,没曾想到看到题解竟然是个二分。。。
题解:正解是个二分,那么如何证明他具有单调性呢,如果他能组成x套牌,那么他一定可以组成x-1套牌,所以可以用二分来解这道题目。
如何check mid是取大了还是取小了呢,假设当前组成mid件,如果a[i]<mid,那么mid-a[i]部分就需要用joker来填充了,所以当设ans是缺少的牌数的总量,所以要保证joker的数量大于ans,那么一个限制条件就是return ans<=k。
想一下还有没有另外一个限制条件呢?当然,题目还要求了 一套牌里面最多使用一个joker,所以我们的ans也要小于mid。
综上所述 return ans<=min(k,mid);(能组成正好mid件或者能做成大于midjia)

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 60;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;

ll a[maxn];
ll n,k;
bool check(ll x){
    ll ans=0;
    for(int i=0;i<n;i++) if(a[i]<x) ans+=x-a[i];
    return ans<=min(k,x);
}
int main()
{

    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    ll l=0,r=1e9;
    ll mid,ans=0;
    while(l<=r){
        mid=(l+r)/2;
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<ans<<endl;
    return 0;
}