(zst的博弈) 【推理+找規律】
阿新 • • 發佈:2017-07-19
size one img 參考 每次 blog 給定 style int 題目:
分析: 看起來像一道博弈論的題,但實際上僅需細心的推理,耐心的找規律即可。 1、因為甲先寫的1,所以乙的所有奇數全部要從甲的偶數哪裏加1得來,因此如果n為奇數,甲只要保證自己寫的數全是 奇數即可,因此奇數的情況下,甲贏。 2、發現因為從 n/2 到 n 兩人只能一個一個加上去,因此從 n/2 到 n (n為偶數)中的所有偶數為必勝狀態。而從 n/4 到 n/2 中的任何一個數乘以2均可跳到 n/2 到 n 的偶數狀態,即為必勝狀態,因此誰先寫下 n/4 到 n/2 中的數,誰就必 勝。而只要某一個人寫下了 n/4 ,對方雖然不會主動乘以2,但當他加了1以後,此人可立即乘以2跳到 n/2 至 n中 的偶數 ,因此誰寫下 n/2 誰就必勝。 綜上:n/4 是一個必勝周期。
參考代碼:
甲乙兩人玩一個遊戲: 一張卡片上有個數字,甲乙兩人輪流操作, 若當前卡片上的數字為x, 每次操作可以把它變為x+1或2x, 且不能超過n (例如n=8,x=6,只能變為7而不能變為12), 每次甲首先在卡片上寫1,規定寫n的人獲勝。給定n, 問甲是否有必勝策略?
分析: 看起來像一道博弈論的題,但實際上僅需細心的推理,耐心的找規律即可。 1、因為甲先寫的1,所以乙的所有奇數全部要從甲的偶數哪裏加1得來,因此如果n為奇數,甲只要保證自己寫的數全是 奇數即可,因此奇數的情況下,甲贏。 2、發現因為從 n/2 到 n 兩人只能一個一個加上去,因此從 n/2 到 n (n為偶數)中的所有偶數為必勝狀態。而從 n/4 到 n/2 中的任何一個數乘以2均可跳到 n/2 到 n 的偶數狀態,即為必勝狀態,因此誰先寫下 n/4 到 n/2 中的數,誰就必 勝。而只要某一個人寫下了 n/4 ,對方雖然不會主動乘以2,但當他加了1以後,此人可立即乘以2跳到 n/2 至 n中 的偶數 ,因此誰寫下 n/2 誰就必勝。 綜上:n/4 是一個必勝周期。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int t; long long n; bool dfs(long long n) { if(n==2) return 0; else if(n%2) return 1; else return dfs(n/4); } int main() { cinView Code>>t; while(t--) { cin>>n; bool f=dfs(n); if(f) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
(zst的博弈) 【推理+找規律】