Description
你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。 给出n, m和ci,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。
Solution
求最大的答案,首先考虑推公式,公式不好推,转而考虑二分答案然后去 。 我们二分一个答案,然后对于每一种牌去检验,如果当前的牌小于答案,那么就要用
去填充,最后注意我们二分的答案不能超过我们用的
数,否则就会出现一次用了两张
的情况,是不合法的。
PS: 我二分的上界一开始是 1e18, 把自己 哭了
Code
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int mod = 100000000;
const int N = 5e5 + 5;
typedef long long ll;
const double pi = acos(-1.0);
int a[N];
int n, m;
bool check(int x) {
ll cur = 0;
for(int i = 1; i <= n; i++) {
if(a[i] < x) {
cur += x - a[i];
}
}
return cur <= m && cur <= x;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
int left = 0, right = 1e9, ans = 0;
while(left <= right) {
int mid = left + right >> 1;
if(check(mid)) {
left = mid + 1;
ans = mid;
} else {
right = mid - 1;
}
}
cout << ans << "\n";
return 0;
}

京公网安备 11010502036488号