Pursuit - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
每次只计算 前n - n/4 大的数的和,求最少要增加多少场才能使得第一个人 的分数 超过第二个人
有博客推导出最多只需要枚举到 3 * n次 的总场次就可以了
以下是推导博客
CF1530C Pursuit 题解 - Daidly's Blog - 洛谷博客 (luogu.com.cn)
#include <bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#define x first
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> PII;
typedef pair<char,int> PCI;
typedef long long LL;
//typedef __int128 i128;
typedef unsigned long long ULL;
const int N=2e5+10,INF = 1e9 ;
const double eps = 1e-7;
int n;
int a[N],b[N];
LL s1[N],s2[N];
bool check(LL x)
{
int k= n + x;
k = k - k/4;
if(s1[k -x] + x * 100 >= s2[min(k,n)])
// 第一个人除新增的场数外 其他场次都选前几大的几个
return 1;
return 0;
}
void solve()
{
cin >> n ;
for(int i=1;i<=n; i++ ) cin >> a[i];
for(int i=1;i<=n; i++ ) cin >> b[i];
int len =n - n/4;
sort(b+1,b+1+n,greater<int>());
sort(a+1,a+1+n,greater<int>());
for(int i=1;i<=n; i++ ) s1[i] = s1[i-1] + a[i];
for(int i=1;i<=n; i++ ) s2[i] = s2[i-1] + b[i];
int k= n - n/4;
if(s1[k] >= s2[k])
{
cout << 0 << endl;return;
}
int l=1,r=1e6;// 1e6以上容易超时
while(l < r )
{
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l =mid + 1;
}
cout << l << endl;
}
int main()
{
// freopen("1.txt","r",stdin);
ios
LL T=1;
cin>>T;
while(T -- )
{
solve();
}
return 0;
}