描述见题面
思路:直接二分可以组成多少套牌,之后去验证一下二分出来的值是否可以达成即可
验证思路:对于每一种牌,我们都去看一下与我们二分出来的数量,它还差多少,差的这部分就用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;
}

京公网安备 11010502036488号