SHOI2008小約翰的遊戲John

2022-05-12 13:02:05 字數 1842 閱讀 8383

time limit: 1 sec  memory limit: 162 mb

submit:

1139  solved: 701

[submit][status]

小約翰經常和他的哥哥玩乙個非常有趣的遊戲:桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石子,但不能一粒石子也不取,我們規定取到最後一粒石子的人算輸。小約翰相當固執,他堅持認為先取的人有很大的優勢,所以他總是先取石子,而他的哥哥就聰明多了,他從來沒有在遊戲中犯過錯誤。小約翰一怒之前請你來做他的參謀。自然,你應該先寫乙個程式,**一下誰將獲得遊戲的勝利。

本題的輸入由多組資料組成,第一行包括乙個整數t,表示輸入總共有t組資料(t≤500)。每組資料的第一行包括乙個整數n(n≤50),表示共有n堆石子,接下來有n個不超過5000的整數,分別表示每堆石子的數目。

每組資料的輸出佔一行,每行輸出乙個單詞。如果約翰能贏得比賽,則輸出「john」,否則輸出「brother」,請注意單詞的大小寫。 2 3 3 5 1 1

1john

brother

【資料規模】

對於40%的資料,t ≤

250。

對於100%的資料,t ≤ 500。

題解:標準的anti-nim遊戲:

[定義](anti-nim 遊戲)

 桌子上有 n 堆石子,遊戲者輪流取石子。

 每次只能從一堆中取出任意數目的石子,但不能不取。

 取走最後乙個石子者敗。

[結論]

先手必勝當且僅當:

(1)所有堆的石子數都為 1 且遊戲的 sg 值為 0;

(2)有些堆的石子數大於 1 且遊戲的 sg 值不為 0。

[證明]

遊戲分兩種情況:

 有 n 個堆,每個堆只有乙個石子。

顯然,先手必勝當且僅當 n 為偶數。

 其他情況。

(1) 當 sg 不為 0 時

若還有至少兩堆石子的數目大於 1,則先手將 sg 值變為 0 即可;

若只有一堆石子數大於 1,則先手總可以將狀態變為有奇數個 1。所

以,當 sg 不為 0 時先手必勝。

(2) 當 sg 為 0 時

至少有兩堆石子的數目大於 1,則先手決策完之後,必定至少有

一堆的石子數大於 1,且 sg 值不為 0,由上段的論證我們可以發現,

此時,無論先手如何決策,都只會將遊戲帶入先手必勝局,所以先

手必敗。--賈志豪

**:

1

vart,i,x,tot,n,ans:longint;

2procedure

main;

3begin

4 readln(n);tot:=0;ans:=0;5

for i:=1

to n do

6begin

7read(x);

8if x=1

then

inc(tot);

9 ans:=ans xor x;

10end;11

if ((tot=n) and (tot and

1=0)) or ((totand (ans<>0)) then writeln('

john

') else writeln('

brother');

12end;13

begin

14readln(t);

15while t>0

do16

begin

17main;

18dec(t);

19end;20

end.

view code

SHOI2008 小約翰的遊戲John

小約翰經常和他的哥哥玩乙個非常有趣的遊戲 桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取 的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石子,但不能一粒石子也不取,我們規定取到最後一 粒石子的人算輸。小約翰相當固執,他堅持認為先取的人有很大的優勢,所以他總是先取石子,而他的哥哥就聰明...

P4279 SHOI2008 小約翰的遊戲

傳送門 顯然的 anti sg 直接套上結論就行 當然也可以略證一下 1.如果石頭堆都只有乙個石頭,那麼堆數為偶數時先手必勝 2.如果某堆有多個石頭,那麼總 sg 不為 0 時先手必勝 考慮只要一堆有多個石頭時,先手可以拿到只剩乙個或者全部拿完,然後就變成 1.的情況並且先手可以隨意控制堆的奇偶,先...

P4279 SHOI2008 小約翰的遊戲

我怎麼什麼都不會啊 qaq 博弈論怎麼和期望一樣玄學啊 qaq 我們分幾種情況討論 case1 只有一堆且為1,那麼後手勝利 case2 每一堆都是1,那麼只需要判斷奇偶性,奇數則先手敗,偶數則後手敗 case3 只有一堆不是1,其餘堆都是1,那麼可以根據就行,先手可以選擇是拿完或是那得只剩乙個 c...