題意
有堆石子(爲偶數),每次玩家要選擇恰好堆石子,並從每一堆中任意拿走數量大於的石子(每堆拿的數量可以不同)。問先手是否必勝。
分析
先上結論:當石子數最小的堆數量不超過時,先手必勝,否則先手必敗。
接下來是感性理解時間。
我們考慮最小堆數量超過的情況。那麼此時先手不管如何選取,都會選到一個最小堆,由於要求每輪取得石子數量大於,那麼最小堆的石子數必然會減少,而且此時取完後最小堆的數量就不會超過。
然後到了下一輪,那麼此時後手可以選擇不包含最小堆的堆,把它們全部變成最小堆,那麼此時顯然最小堆數量又將大於。那麼就將進入一個循環。
但是這個循環總會有終止的時刻,也就是當最小堆石子數量爲且堆數超過時,遊戲結束,最後操作的人獲勝。觀察上面的過程,我們發現只有後手才能把最小堆的數量變爲超過,而先手只能被動地將最小值變小,所以最後勝利者一定是後手。
所以得出結論:當石子數最小的堆數量不超過時,先手必勝,否則先手必敗。
#include <bits/stdc++.h>
#define MAX 105
using namespace std;
int n;
int a[MAX];
int main()
{
cin >> n;
int mn = 0x3f3f3f3f, cnt = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
if(a[i] < mn) mn = a[i], cnt = 1;
else if(a[i] == mn) cnt++;
}
if(cnt <= n/2) puts("Alice");
else puts("Bob");
return 0;
}