C. Pursuit
题意:
给出a,b两个数组,分别为两人的目前的得分,总得分要减去n/4个最少的得分,问最少再进行几次比赛。
主要思路:
比赛的时候思路挺混乱的,就是加加减减的弄不明白,还一直超时,比赛结束后看了别人的代码,发现二分答案既能解决超时的问题,又能一下就确定应该减去多少。
//二分+前缀和
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
ll sum1,sum2;
int a[N],b[N];
int sa[N],sb[N];
bool judge(int mid)
{
int k=(n+mid)/4;
int s1=sa[k],s2;
if(k>mid) s2=sb[k-mid];
else s2=0;
if((sum1+mid*100-s1) >= (sum2-s2))
return 1;
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
sum1=0,sum2=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum1+=a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
sum2+=b[i];
}
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sa[1]=a[1],sb[1]=b[1];
for(int i=2;i<=n;i++)
{
sa[i]=a[i]+sa[i-1];
sb[i]=b[i]+sb[i-1];
}
int l=0,r=n;
while(l<r)
{
int mid=(l+r)>>1;
if(judge(mid))//满足
r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}