取石子遊戲解題報告

2021-07-01 18:56:18 字數 1021 閱讀 2118

有兩堆石子,兩個人輪流去取.每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍.最後誰能夠把一堆石子取空誰就算贏.

比如初始的時候兩堆石子的數目是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...