若干堆牌,每张牌有不同的分值,两个人,一个人每次选一堆拿走顶端的牌,另一个人选一堆,拿走堆底的牌,两人都是最优策略,问最后每人多少分...看起来好像是个博弈,实际上感觉就是个脑筋急转弯,因为最优的情况,最后一定是每一堆两人各去一半,然后轮流拿走奇数堆中间的牌...因为如果某一堆的最优点偏下的话,B一定能强迫A只能拿到中间,如果最优点偏上,那么A同样一定也能强迫B只能拿到中间为止..所以最后就是一人一半,想到这点这题也就没什么然后了......
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
int n,m,k,x,y;
int s1,s2;
int a[1000];
int ct;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
ct=s1=s2=0;
memset(a,0,sizeof a);
for (int i=1; i<=n; i++)
{
scanf("%d",&m);
k=(m>>1);
for (int j=1; j<=k; j++)
{
scanf("%d",&x);
s1+=x;
}
if (m & 1)
{
scanf("%d",&a[ct++]);
}
for (int j=1; j<=k; j++)
{
scanf("%d",&x);
s2+=x;
}
}
sort(a,a+ct,cmp);
for (int i=0; i<ct; i+=2)
{
s1+=a[i];
s2+=a[i+1];
}
cout<<s1<<" "<<s2<<endl;
}
return 0;
}