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();

	
	
	
	
}
posted @ 2025-04-16 20:28  LteShuai  阅读(17)  评论(0)    收藏  举报