取石子遊戲 HDU2516(斐波那契博弈)
阿新 • • 發佈:2018-05-06
裸題 左右 get code span target oid otto HR
參看Sample Output.
Sample Input
2
13
10000
0
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2516
題目:
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 Output Second win Second win First win 思路:斐波那契博弈裸題,先手必勝的條件為n不是一個斐波那契數。因此,我們先打表,求出1~2^31次方內的所有斐波那契數求出來,然後一邊循環即可,因為易知斐波那契數列增長極快,到50項左右時就已經爆int了,所以進行遍歷時復雜度為常數級。 代碼實現如下:
1 #include <cstdio> 2 3 int n; 4 int a[55]; 5 6 voidinit() { 7 a[0] = 2, a[1] = 3; 8 for(int i = 2; i <= 45; i++) { 9 a[i] = a[i-1] + a[i-2]; 10 } 11 } 12 13 int main() { 14 init(); 15 while(~scanf("%lld", &n) && n) { 16 int flag = 1; 17 for(int i = 0; i <= 45; i++) { 18 if(a[i] == n) { 19 puts("Second win"); 20 flag = 0; 21 break; 22 } 23 } 24 if(flag) puts("First win"); 25 } 26 return 0; 27 }
取石子遊戲 HDU2516(斐波那契博弈)