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