CodeForces-Game with Marbles (Hard Version)
题目

题目思路
这道题需要证明,因为数据大了,就不能正常搜索解决问题了,然后这里也不是简单的贪心,我一开始就是贪心做,导致出错,
证明:
x u
y v
first circumstance:x-1-(v-1)=x-v
second circumstance:u-1-(y-1)=u-y
假设我们给了
30 50
50 25
很显然 我是Alice 先选30 让Bob只能选25的,这里不是先选50,可以模拟下的,所以fs的收益要大于sc的收益,只需要总和更大嘛即x-v>u-y
所以这道题就做完了
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
struct node{
ll x,y;
ll sum;
}a[200005];
bool cmp(node a,node b)
{
return a.sum>b.sum;
}
void solve()
{
int n;
cin>>n;
ll ans=0;
memset(a,0,sizeof a);
for(int i=1;i<=n;i++)cin>>a[i].x;
for(int i=1;i<=n;i++)cin>>a[i].y;
for(int i=1;i<=n;i++)
a[i].sum=a[i].x+a[i].y;
sort(a+1,a+1+n,cmp);
int num=1;
while(num<=n)
{
if(num%2==1)
{ if((a[num].x)==0)break;
ans+=a[num].x-1;
num++;
//cout<<ans<<" "<<num-1<<endl;
}
else
{if((a[num].y)==0)break;
ans-=a[num].y-1;
num++;
// cout<<ans<<" "<<num-1<<endl;
}
}
cout<<ans<<endl;
return ;
}
int main()
{
int t;
cin>>t;
while(t--)solve();
}

浙公网安备 33010602011771号