题意:
两个人 A,B分别拥有 a[], b[] 两个序列,每个人还分别拥有 ans1,ans2 两个财富值,初始为0;
他们做游戏:每一轮A先开始,可以选择从a[] 序列选择一个值放入自己的ans1(然后这个值被去掉),或者去掉B的序列中的某个值,然后轮到B,他也这样做,然后他们每个人都想让自己的ans 减去对方的 ans尽量大;
问最后的ans1-ans2 是多少
思路:
考虑某个人,其最优策略就是让对方尽量小,让自己的值尽量大,这样的话轮到每个人的时候,如果对方的最大值比自己的最大值大的话,那就把对方的最大值给丢掉,否则留着肯定会比自己大;如果自己的最大值比对方大的话就把自己的最大值用掉,增加自己的ans,,
按上述最优策略模拟就好了,
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a[maxn], b[maxn];
bool cmp(int a, int b) {
return a > b;
}
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
sort(a+1, a+1+n, cmp);
for(int i = 1; i <= n; ++i) {
scanf("%d", &b[i]);
}
sort(b+1, b+1+n, cmp);
int id1 = 1, id2 = 1;
ll ans1 = 0, ans2 = 0;
while(id1 <= n || id2 <= n) {
// A first elect
if(id1 <= n) {
if(id2 <= n) {
if(a[id1] >= b[id2]) {
ans1 += a[id1++];
}
else {
id2++;
}
}
else {
ans1 += a[id1++];
}
}
else {
id2++;
}
// B second elect
if(id2 <= n) {
if(id1 <= n) {
if(b[id2] >= a[id1]) {
ans2 += b[id2++];
}
else {
id1++;
}
}
else {
ans2 += b[id2++];
}
}
else {
id1++;
}
}
printf("%lld\n", ans1-ans2);
return 0;
}