bzoj1022 小約翰的遊戲John

2021-07-10 14:21:08 字數 942 閱讀 2003

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

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

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

2 3

3 5 1 1 1

john

brother

【資料規模】

對於40%的資料,t ≤ 250。

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

這題一看就是博弈論。題面太明顯。。

那麼怎麼做呢?我們可以發現這道題就是經典nim取石子遊戲的簡單變形,就是取到最後乙個輸。

首先我們分析一下問題可以發現:

1、如果一堆數目為1 必敗; 否則必勝。

2、如果堆數為2 兩堆相同且不為一,必敗;否則必勝。

3、就是要拿完後讓兩堆相同且不為一。

那麼這就是sg函式了。每一堆的sg值是它堆本身的數量。把全是一的情況分開討論,剩下求sg值就可以了。

#include using namespace std;

int n,t;

int a[55];

int main()

if (ans == 0)

else

} return 0;

}

SHOI2008 小約翰的遊戲John

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

SHOI2008小約翰的遊戲John

time limit 1 sec memory limit 162 mb submit 1139 solved 701 submit status 小約翰經常和他的哥哥玩乙個非常有趣的遊戲 桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石...

P4279 SHOI2008 小約翰的遊戲

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