有兩堆石子,兩個人輪流去取.每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍.最後誰能夠把一堆石子取空誰就算贏.
比如初始的時候兩堆石子的數目是25和7
25 7 –> 11 7 –> 4 7 –> 4 3 –> 1 3 –> 1 0
選手1取
選手2取
選手1取
選手2取
選手1取
最後選手1(先取的)獲勝,在取的過程中選手2都只有唯一的一種取法。
給定初始時石子的數目,如果兩個人都採取最優策略,請問先手能否獲勝。
這又是一道博弈論的題,似乎是一道很基礎的題,但是我依然不會做。
是這個樣子的,設a≤
b ,則若a≤
2b或b|a,則先手必勝,否則先手只有一種取法,就取下這種,看後手是否會贏,如此遞迴下去,時間複雜度是log級的。
考慮為什麼這種情況下先手必勝。
對於b|a的情況是顯然的,而若a≤
2b,我們考慮a%b,假如a%
b≤⌊b
2⌋,則顯然我們取b∗
⌊ab−
1⌋即可令後手選法唯一且在其選過之後,留給先手的是a≤
b 或b|a的局面;而同樣的道理,若a%
b>⌊b
2⌋,我們只需取b∗
⌊ab⌋
即可。
所以我們便找到了必勝態。
**很短:
#include
#include
#include
using
namespace
std;
int main()while(n/m<2&&n%m);
if(tot&1)puts("lose");
else
puts("win");}}
}
= =但是我感覺,博弈論的題證明起來好說,正面推的話就蛋疼;做題的時候。。還是先打表找規律,再深入思考吧。。不過大體思路似乎都是尋找必敗態或必勝態,然後再從乙個搞出另乙個。 A 取石子遊戲(解題報告)
a 取石子遊戲 time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意...
取石子遊戲解題報告
有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。in...
NYOJ 23 取石子(一) 解題報告
取石子 一 時間限制 3000 ms 記憶體限制 65535kb 難度 2 描述 一天,tt 在寢室閒著無聊,和同寢的人玩起了取石子遊戲,而由於條件有限,他 她們是用旺仔小饅頭當作石子。遊戲的規則是這樣的。設有一堆石子,數量為n 1 n 1000000 兩個人輪番取出其中的若干個,每次最多取m個 1...