三道博弈论入门题

首先同窗们要学习一下博弈论...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;
}
相关文章
相关标签/搜索