Pursuit(二分)

Pursuit - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem - 1530C - Codeforces

每次只计算 前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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值