题目链接:http://codeforces.com/problemset/problem/1038/C
题目大意:A和B两个玩家玩一个游戏。起初A和B都会有一个等长的数组,然后每次每个玩家能够选择在自家数组中选择一个数或者删除对方数组中的数。已经拿走或者被删除的数不能够再被选择。然后问最后两个玩家的得分之差(A-B)。
题解思路:首先我们应该清楚,每个回合(A和B各选择一次)将会有两个数不能再被选择,因为总共2n个数,所以也就是n个回合结束游戏。所以最外层一个循环,里面模拟A和B的选择即可。
至于A和B的选择,因为两个人都是采用最有策略,所以,只需要判断当前“删除对方一个最大元素”和“得到自己一个最大元素”两者对自己那个最有利。因此只需要判断当前对方最大元素和自己最大元素的大小,如果自己的大,那么选自己,否则删除对方的元素。
代码:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define LL long long
int n,a[MAXN],b[MAXN];
LL asum,bsum;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)scanf("%d",&b[i]);
sort(a,a+n);asum=0;int i=n-1;
sort(b,b+n);bsum=0;int j=n-1;
for(int k=0;k<n;k++){
if(a[i]>=b[j])asum+=a[i],i--;
else j--;
if(b[j]>=a[i])bsum+=b[j],j--;
else i--;
}
cout<<asum-bsum;
return 0;
}