题目链接:http://codeforces.com/problemset/problem/388/C
题意:桌上有n副牌,每张牌有个权值,一人可以从牌堆顶取一张,一认可以从牌堆底取一张,轮流下去直到牌没有了,都选择最优的策略,问最后他们各自的牌权值和
思路:刚开始想……每次都取最大的牌不就好了么,然后打脸了,按照博弈论的策略因为双方都要抑制对方,每一套牌他们各取一半,如果有剩下一张则最后和所有剩下的排序再轮流取
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 1030
using namespace std;
int s[maxn];
int main()
{
int n,m;
while (scanf("%d",&n)!=EOF)
{
int res1=0,res2=0,cnt=0;
for (int j=0;j<n;j++)
{//cout<<":"<<j<<endl;
scanf("%d",&m);
if (m%2==0)
{
for (int i=1;i<=m;i++)
{
int tem;
scanf("%d",&tem);
if (i<=m/2) res1+=tem;
else res2+=tem;
}
}
else
{
for (int i=1;i<=m;i++)
{
int tem;
scanf("%d",&tem);
if (i<=m/2) res1+=tem;
else if (i==m/2+1) s[cnt++]=tem;
else res2+=tem;
}
}
}
sort(s,s+cnt);
int flag=1;
for (int i=cnt-1;i>=0;i--)
{
if (flag==1) res1+=s[i];
else res2+=s[i];
flag=!flag;
}
printf("%d %d\n",res1,res2);
}
}