思路:
把两个人A,B的得分排序求前缀和,然后二分,二分的变量是额外打的场数k,将它和已经打的场数m比较,如果 m < = k m <= k m<=k,自己一定都是满分,不然就是k场满分和取前m-k大的分数即可,Ilya只能小不能大,之后的直接补0即可
代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
sort(a.begin(), a.end(), greater<>());
sort(b.begin(), b.end(), greater<>());
vector<ll> sa(n + 1), sb(n + 1);
for (int i = 0; i < n; i++) {
sa[i + 1] = sa[i] + a[i];
sb[i + 1] = sb[i] + b[i];
}
int lo = 0, hi = 1e7;
while (lo < hi) {
int k = (lo + hi) / 2;
int m = (n + k) - (n + k) / 4;
int ca, cb;
if (m <= k) { //额外打的场数k不小于已经打的场数m
ca = 100 * m;
} else { //计算你的得分
ca = 100 * k + sa[m - k];
}
//Ilya之后的直接补0,所以只能小不能大
cb = sb[min(n, m)];
if (ca >= cb) {
hi = k;
} else {
lo = k + 1;
}
}
cout << lo << "\n";
}
return 0;
}