描述见题面
思路:直接二分可以组成多少套牌,之后去验证一下二分出来的值是否可以达成即可
验证思路:对于每一种牌,我们都去看一下与我们二分出来的数量,它还差多少,差的这部分就用joker补上,用一个值sum记录joker使用了几张,只要使用joker的数量大于给定的joker数量就直接返回,最后再检验一下joker的数量是否超过了我们二分出的套牌数,如果超过了说明有某几套里面使用了不止一张joker,也返回false。
代码:

#include <iostream>

using namespace std;

typedef long long LL;

const int N = 100;

LL a[N];  // 存储每种牌的数量
LL n, m;

bool check(LL x)
{
    LL sum = 0;  // 用来记录我们当前使用的joker数目
    for (int i = 0; i < n; i ++ ) 
    {
        if (a[i] < x) sum += x - a[i];
        if (sum > m) return false;  // joker数大于给定数直接返回
    }

    if (sum > x) return false;  // 使用joker的数目不能大于套牌数,否则代表某一套中有两张joker
    return true;
}

int main()
{
    cin >> n >> m;
    LL max_ = 0;
    for (int i = 0; i < n; i ++ ) cin >> a[i];

    LL l = 0, r = 1e9;
    while (l < r)
    {
        LL mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }

    cout << l << endl;

    return 0;
}