题意
题解
直接求牌组数不容易求,考虑二分检验答案。若某类牌的数量小于牌组数,则余下的位置用 J o k e Joke Joke 补上;若处理完每一类牌,所需的 J o k e Joke Joke 数量小于 m m m 且小于牌组数(保证每一组至多一张 J o k e Joke Joke),则有可行方案。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 55
int n, m, c[maxn];
bool judge(int x)
{
int s = 0;
for (int i = 0; i < n; i++)
{
if (c[i] >= x) continue;
s += x - c[i];
if (s > x || s > m) return 0;
}
return 1;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", c + i);
int lb = 0, ub = inf;
while (ub - lb > 1)
{
int mid = (lb + ub) >> 1;
if (judge(mid)) lb = mid;
else ub = mid;
}
printf("%d\n", lb);
return 0;
}