题目大意
桌子上有 \(n\) 堆牌,每张牌上都有一个正整数。
A
可以从任何非空牌堆的顶部取出一张牌,B
可以从任何非空牌堆的底部取出一张牌。
A
先取,当所有的牌堆都变空时游戏结束。
他们都想最大化他所拿牌的分数(即每张牌上正整数的和)。
问他们所拿牌的分数分别是多少?
解题思路
经典的博弈论。
显然的贪心。
显然,对于每一堆牌,两个人都要保护属于自己那一半不被拿走(上面的一半或下面的一半)。
那么如果牌堆中牌数是偶数,那么各自分一半。
否则,牌堆中牌数是奇数,那么会在中间那一张上起争执。
于是两个人就会轮流取中间牌的最大值。
用 priority_queue
维护当前还剩的最大值即可。
CODE
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100007];
int A, B;
priority_queue<int> pq;
signed main()
{
scanf("%d", &n);
for (int i = 1, j, x; i <= n; ++i)
{
scanf("%d", a + i);
for (j = 1; j <= (a[i] >> 1); ++j)
{
scanf("%d", &x);
A += x;
}
if (a[i] & 1)
{
scanf("%d", &x);
pq.push(x);
++j;
}
for (; j <= a[i]; ++j)
{
scanf("%d", &x);
B += x;
}
}
int p = 1;
while (!pq.empty())
{
if (p)
A += pq.top();
else
B += pq.top();
pq.pop();
p ^= 1;
}
printf("%d %d\n", A, B);
return 0;
}