http://codeforces.com/contest/389/problem/E
题意:给你n个序列,然后两个人x,y,两个人玩游戏,x从序列的前面取,y从序列的后面取,两个人都想自己得到的数的和尽可能大,最后输出两个人得到的数的和。
思路:如果序列的个数为偶数的话,前面一半为x所得,后面一半为y所得; 如果为奇数的话,中间的数根据它的大小决定谁得到。这样的处理方式因为两个人都尽可能的取得序列中的最大,在谁的那一半数大的,另一个人取不到,有的时候可以先放一放,去取别人即将取到的数。
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define maxn 1000
using namespace std; int n;
int x[maxn]; int main()
{
scanf("%d",&n);
int ans1=,ans2=;
int x,k;
vector<int>q;
while(n--)
{
scanf("%d",&k);
for(int i=; i<=k/; i++)
{
scanf("%d",&x);
ans1+=x;
}
if(k%)
{
scanf("%d",&x);
q.push_back(x);
}
for(int i=; i<=k/; i++)
{
scanf("%d",&x);
ans2+=x;
}
}
sort(q.begin(),q.end());
int cnt=;
for(int i=(int)q.size()-; i>=; i--)
{
if(cnt%==) ans1+=q[i];
else ans2+=q[i];
cnt++;
}
printf("%d %d\n",ans1,ans2);
return ;
}