【題解】CF1147C Thanos Nim

題意

傳送門

nn堆石子(nn爲偶數),每次玩家要選擇恰好n2\frac{n}{2}堆石子,並從每一堆中任意拿走數量大於00的石子(每堆拿的數量可以不同)。問先手是否必勝。

分析

先上結論:當石子數最小的堆數量不超過n2\frac{n}{2}​時,先手必勝,否則先手必敗。

接下來是感性理解時間。

我們考慮最小堆數量超過n2\frac{n}{2}的情況。那麼此時先手不管如何選取,都會選到一個最小堆,由於要求每輪取得石子數量大於00,那麼最小堆的石子數必然會減少,而且此時取完後最小堆的數量就不會超過n2\frac{n}{2}

然後到了下一輪,那麼此時後手可以選擇不包含最小堆的n2\frac{n}{2}堆,把它們全部變成最小堆,那麼此時顯然最小堆數量又將大於n2\frac{n}{2}。那麼就將進入一個循環。

但是這個循環總會有終止的時刻,也就是當最小堆石子數量爲00且堆數超過n2\frac{n}{2}時,遊戲結束,最後操作的人獲勝。觀察上面的過程,我們發現只有後手才能把最小堆的數量變爲超過n2\frac{n}{2},而先手只能被動地將最小值變小,所以最後勝利者一定是後手。

所以得出結論:當石子數最小的堆數量不超過n2\frac{n}{2}時,先手必勝,否則先手必敗。

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章