取纸牌游戏(贪心)

取纸牌游戏
总时间限制: 1000ms 内存限制: 65536kB
描述
有N张纸牌,每张牌上写着一个整数Ai。Alice和Bob玩取纸牌游戏。玩法是这样的:每人轮流从纸牌堆里取一张牌,Alice先取。当所有牌取完后,游戏结束。每人的得分是他取到的牌上整数之和。如果他们每次都按最优策略取牌使自己的得分最大化。求游戏结束后Alice的得分减去Bob得分的结果。
输入
第1行:1个整数N,表示牌的张数(1<=N<=100)
第2行:N个整数,表示每张牌上的整数Ai(1<=Ai<=1000)
输出
第1行:1个整数,表示Alice的得分减去Bob的得分的差值
样例输入

2
3 1

样例输出

2

提示
Alice先取,按最优策略,她取走3,Bob取走1。因此得分之差为:3-1=2

思路点拔:由于本题中,Alice与Bob都是选择最优的取牌方式,所以,本题又变成了一到典型的贪心,我们来走一走他们的取牌过程:首先,Alice一定会去最大的牌,然后Bob也不甘示弱,取第二大的牌,接着,Alice会取走第三大的牌,随后,Bob会取走第四大的牌……接着Alice会取走k大的牌,Bob会取走K+1大的牌,这样确实是局部最优解,也确实能推到全局最优解,所以,我们将数列进行从大到小排序,然后将下标为奇数的累加起来,表示Alice的最终得分,将下标为偶数的累加起来,表示Bob的最终得分,最后,用Alice的得分减去Bob的得分就是答案!!上代码!

#include<cstdio>
#include<algorithm>
using namespace std;
int sum,sum1;
bool cmp(int x,int y) //从小到大排序(相当于运算符重载)
{
    return x>y;
}
int main()
{
    int n,a[105];
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]); 
    }
    sort(a+1,a+n+1,cmp); //排序
    for(int i=1;i<=n;i++)
    {
        if(i%2==1) //统计Alice的得分
            sum+=a[i];  
        if(i%2==0) //统计Bob的得分
            sum1+=a[i];
    }
    printf("%d\n",sum-sum1); //算出两人的分差并输出
    return 0; //结束
}

猜你喜欢

转载自blog.csdn.net/qq_42995099/article/details/82054728