三道博弈論入門題

首先同窗們要學習一下博弈論...php

而後這裏是杭電上的三道題:html

1.最(zhui)簡單(dang)的巴什博奕

傳送門c++

題意

題目很少說了,就是兩我的取 n 個石子,每次最多取 m 個,不能操做者輸函數

分析

其實呢,這玩意兒看標題的連接裏的就行了,就是個裸題,代碼簡短愉快學習

//by Judge
#include<bits/stdc++.h>
#define Rg register 
int T,n,m;
int main(){ scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        puts(n%(m+1)?"first":"second");
    } return 0;
}

2.很(heng)簡單(dang)的巴什博奕

傳送門ui

題意

題目很少說了,其實就是巴什博奕的變種spa

分析

首先咱們能夠看出,當前操做者面對 \(X=[n-k,n-1]\) 的狀況時必勝code

而普通巴什博奕是當前操做者面對剩下 \([1,k]\) 個石子時必勝,能夠看到這裏就是反了一下htm

因而咱們把 n 減去 1 以後就能夠當作普通的巴什博奕把加石子當作減石子作了,代碼依舊短blog

//by Judge
#include<bits/stdc++.h>
#define Rg register 
int n,m;
int main(){
    while(~scanf("%d%d",&n,&m)&&n&&m)
        puts((n-1)%(m+1)?"Tang":"Jiang");
    return 0;
}

3.不是很難(nang)的SG 函數

傳送門

題意

取 n 個石子,每次取 2 的冪次,不能操做者輸

分析

SG 函數,標題裏有連接

SG 函數定義直接上,裸題,這數據範圍 \(n^2\) 也徹底頂得住...代碼相對上面小長

//by Judge
#include<bits/stdc++.h>
#define Rg register 
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
int n; int g[1003],h[1003];
inline void solv(int n){
    fp(i,1,n){ memset(h,0,(n+2)<<2);
        for(Rg int j=1;j<=i;j<<=1)
            h[g[i-j]]=1;
        fp(j,0,i) if(!h[j]){
            g[i]=j; break;
        }
    }
}
int main(){ solv(1000);
    while(~scanf("%d",&n))
        puts(g[n]?"Kiki":"Cici");
    return 0;
}
相關文章
相關標籤/搜索