Yet Another Stones Game(SG函數&博弈論)

Yet Another Stones Game(SG函數&博弈論)

傳送門

思路:博弈問題考慮每個子游戲的NimNim和,當n=2n=2時,顯然就是最小子游戲。所以對n=4n=4開始考慮,假設先手所選的兩堆爲x,yx,y,不妨設xyx\leq y.

顯然有sg(0,y)=0sg(0,y)=0.

sg(1,y)=1sg(1,y)=1後繼狀態只有sg(0,y)sg(0,y).

同理sg(2,y)=2sg(2,y)=2

依次類推sg(x,y)=xsg(x,y)=x

顯然sg(x1,x2xn)sg(x_1,x_2\dots x_n)取決於最小的那一堆,因爲每次都必須至少拿一個,至多將那堆全部拿掉,而前面的狀態的sgsg值是(0,1,min1)(0,1,\dots min-1).

所以sg(x1,x2xn)=minsg(x_1,x_2\dots x_n)=min.

所以判斷一下最小值是否大於n2\dfrac{n}{2}即可。若大於n2\dfrac{n}{2}sg(game1)=sg(game2)=minsg(game1)sg(game2)=0.sg(game_1)=sg(game_2)=min\rightarrow sg(game_1)\oplus sg(game_2)=0.

反之先手可以讓對手處於該局面。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+n+1);
        if(a[1]==a[n/2+1]) puts("Sad Little Gyro");
        else puts("Happy Little Gyro");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章