1. 程式人生 > >取紙牌遊戲(貪心)

取紙牌遊戲(貪心)

取紙牌遊戲
總時間限制: 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; //結束 }