取紙牌遊戲(貪心)
阿新 • • 發佈:2019-02-10
取紙牌遊戲
總時間限制: 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; //結束
}