388C Fox and Card Game【贪心+对称】
题目大意:
两个人轮流从若干堆牌中取数,A只能从上往下取,B只能从下往上取。
A先取
两人都想自己的数之和尽可能大。
问两个人的数字大概有多少。
分析:
因为对称性。两个人如果有一个人想放弃自己这一边的一个数,而去取另一边的数的话,对手一定可以先取走这个数,所以不存在这种情况。
每个人都只能取自己这半边的数。
对于所有中间的数,应该是从大到小轮流取。
代码:
#include <bits/stdc++.h>
using namespace std;
vector<int>v;
int main()
{
int n;
scanf("%d",&n);
int c1=0,c2=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
for(int j=1;j<=x/2;j++)
{
int t;scanf("%d",&t);
c1+=t;
}
int p = x/2+1;
if(x%2){int t;scanf("%d",&t);v.push_back(t);p++;}
for(int j=p;j<=x;j++)
{
int t;
scanf("%d",&t);
c2+=t;
}
}
sort(v.begin(),v.end());
for(int i=v.size()-1;i>=0;i-=2)
{
c1+=v[i];
if(i-1>=0) c2+=v[i-1];
}
cout<<c1<<" "<<c2<<endl;
return 0;
}