HDU3951 Coin Game
阿新 • • 發佈:2020-12-26
hdu傳送門
vjudge傳送門
好久沒有做博弈論的題了,所以比賽的時候遇到這題基本上就是沒思路。
這題跟nim遊戲以及sg函式等博弈論知識沒什麼關係,但是用到了博弈論的一個經典思路:映象操作。
當玩家一拿完後,必然斷環成鏈,而如果玩家二再把這條鏈分成完全相同的兩部分,那麼只要完全仿照玩家一的做法,玩家二必然能贏。
所以只要判斷能否分成相等兩部分即可:
1.如果\(n \leqslant k\),那麼玩家一贏。
2.否則當\(k > 1\)的時候,必然能分成相等的兩部分,即玩家二贏。
3.當\(k=1\)且\(n-1\)為奇數時,玩家二贏。
#include<cstdio> #include<cctype> using namespace std; #define In inline typedef long long ll; In ll read() { ll ans = 0; char ch = getchar(), las = ' '; while(!isdigit(ch)) las = ch, ch = getchar(); while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); if(las == '-') ans = -ans; return ans; } In bool solve(int n, int K) { if(n <= K) return 1; if(K > 1) return 0; return n & 1; } int main() { // MYFILE(); int T = read(); for(int i = 1; i <= T; ++i) { int n = read(), K = read(); printf("Case %d: %s\n", i, solve(n, K) ? "first" : "second"); } return 0; }