题意:有几堆牌,每一张牌上都有一个数字,两个人抽牌,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贪心,证明过程给不出来,但贪心策略合情合理的,很有可能是对的。