HDU 2516 取石子游戲 (博弈論)
阿新 • • 發佈:2019-02-10
取石子游戲
Problem Description 1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出"Second win".先取者勝輸出"First win".Input 輸入有多組.每組第1行是2<=n<2^31. n=0退出.
Output 先取者負輸出"Second win". 先取者勝輸出"First win".
參看Sample Output.
Sample Input 2 13 10000 0
Sample Output Second win Second win First win
Source
解題思路:
解題程式碼:這題沒法用sg直接求了,資料量太大了,而且sg會受上次的影響,所以不一定。
因此,只能打表找規律,找到規律發現如果滿足斐波那契數列 f[n]=f[n-1]+f[n-2] 的數列,Second Win 否則 ,First Win
#include <iostream> #include <cstdio> #include <set> using namespace std; set <int> mys; void ini(){ int f1=1,f2=1,f3=2; while(true){ f3=f1+f2; if(f3<=0) break; mys.insert(f3); f1=f2; f2=f3; } } int main(){ ini(); int n; while(scanf("%d",&n)!=EOF && n!=0){ if(mys.find(n)!=mys.end()) printf("Second win\n"); else printf("First win\n"); } return 0; }