标签:pq int scanf Fox 所拿牌 priority 一半 Game Card
题目大意
桌子上有 \(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;
}
标签:pq,int,scanf,Fox,所拿牌,priority,一半,Game,Card 来源: https://www.cnblogs.com/orzz/p/15519655.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。