Fox and Card Game CodeForces

来源:互联网 发布:nodejs 多个js 编辑:程序博客网 时间:2024/05/22 05:14

题意:有几堆牌,每一张牌上都有一个数字,两个人抽牌,A只能从牌顶抽,B只能从牌底抽。A先手,问,每个人都采取最优策略的情况下,最后两个人的值分别是多少

思路:首先,对于A和B来说,所有的牌都是已知的。对于偶数的牌堆,对于A来说,不管前一半是大于后面一半或者是小于,都没有意义,反正一人一半。对于奇数的,想去取最大的那个。

反正我觉得这题说证明过程说不出来,只能说好像是这样,似乎也蛮合乎道理的,看了网上很多的解题报告,其实讲的也不清的。 只能说贪心有时候要xjb贪心(当然要相对合理),然后结合下样例试试。 目前只能想到这了。

#include <bits/stdc++.h>using namespace std;typedef long long ll;int n;vector <int> a;bool cmp(const int& a,const int&b){    return a>b;}int main(void){    cin >> n;    int sum1=0,sum2=0;    for(int i=1;i<=n;i++)    {        int num;        scanf("%d",&num);        if(num%2==0)        {            for(int i=1;i<=num/2;i++)            {                int temp;                scanf("%d",&temp);                sum1+=temp;            }            for(int i=1;i<=num/2;i++)            {                int temp;                scanf("%d",&temp);                sum2+=temp;            }        }        else        {            int temp;            for(int i=1;i<=num/2;i++)            {                scanf("%d",&temp);                sum1+=temp;            }            scanf("%d",&temp);            a.push_back(temp);            for(int i=1;i<=num/2;i++)            {                int temp;                scanf("%d",&temp);                sum2+=temp;            }        }    }    //printf("%d %d\n",sum1,sum2);    sort(a.begin(),a.end(),cmp);    for(int i=0;i<a.size();i++)    {        if(i==0 || i%2==0)            sum1+=a[i];        else            sum2+=a[i];    }    printf("%d %d\n",sum1,sum2);}

//这题刚拿到我就想到贪心了,接下来我想着贪心策略,想着想着就想错了(我以为是对的)。然后一直就想怎么去实现我的思路,结果放弃了,因为很难实现。 `
// DIV 1的C题。 意想不到的做了div1 ,其实发现题目没有想象中的那么难,感谢岐哥的套路

通过这题我学到了什么?
1.比赛的时候,碰到贪心的题,一定要敢去想,有时候xjb贪心,证明过程给不出来,但贪心策略合情合理的,很有可能是对的。