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,由上段的論證我們可以發現,
此時,無論先手如何決策,都只會將遊戲帶入先手必勝局,所以先
手必敗。--賈志豪
**:
1view codevart,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.
SHOI2008 小約翰的遊戲John
小約翰經常和他的哥哥玩乙個非常有趣的遊戲 桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取 的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石子,但不能一粒石子也不取,我們規定取到最後一 粒石子的人算輸。小約翰相當固執,他堅持認為先取的人有很大的優勢,所以他總是先取石子,而他的哥哥就聰明...
P4279 SHOI2008 小約翰的遊戲
傳送門 顯然的 anti sg 直接套上結論就行 當然也可以略證一下 1.如果石頭堆都只有乙個石頭,那麼堆數為偶數時先手必勝 2.如果某堆有多個石頭,那麼總 sg 不為 0 時先手必勝 考慮只要一堆有多個石頭時,先手可以拿到只剩乙個或者全部拿完,然後就變成 1.的情況並且先手可以隨意控制堆的奇偶,先...
P4279 SHOI2008 小約翰的遊戲
我怎麼什麼都不會啊 qaq 博弈論怎麼和期望一樣玄學啊 qaq 我們分幾種情況討論 case1 只有一堆且為1,那麼後手勝利 case2 每一堆都是1,那麼只需要判斷奇偶性,奇數則先手敗,偶數則後手敗 case3 只有一堆不是1,其餘堆都是1,那麼可以根據就行,先手可以選擇是拿完或是那得只剩乙個 c...