题意:
n堆卡片 每堆si张 两个人博弈拿卡片 他们都采用最优方式 先手只能拿某堆的顶 后手只能拿某堆的底 问最后比分
思路:
纯考脑子题 想通无难度…
想象两种情况: 1、先手想拿某堆超过一半 2、后手想拿某堆超过一半
对于1: 后手只需要跟着先手 先手拿哪堆他就拿哪堆 那么先手的企图一定会被阻止
对于2: 先手快一步 一定可以阻止后手
结论: 两个人在任何一堆拿的张数都不可能超过一半!!
所以 如果某堆是偶数张卡片 一定是前后一半两人平分 如果是奇数就剩下最中间的一张
所有的“中间”卡片可以构成一个集合 这个集合满足每个元素两人都能拿 那么就变成两人轮流拿里面最大的就好
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int> qu;
int n,m,ans1,ans2;
int main()
{
int i,mid,tmp;
while(!qu.empty()) qu.pop();
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
mid=m>>1;
for(i=1;i<=mid;i++)
{
scanf("%d",&tmp);
ans1+=tmp;
}
if(m&1)
{
i++;
scanf("%d",&tmp);
qu.push(tmp);
}
for(;i<=m;i++)
{
scanf("%d",&tmp);
ans2+=tmp;
}
}
while(!qu.empty())
{
ans1+=qu.top();
qu.pop();
if(qu.empty()) break;
ans2+=qu.top();
qu.pop();
}
printf("%d %d\n",ans1,ans2);
return 0;
}