BZOJ 1022: [SHOI2008]小約翰的遊戲John
阿新 • • 發佈:2018-11-08
nim res %d inpu lan () lse accep 選擇
Submit: 3459 Solved: 2234
[Submit][Status][Discuss]
3
3 5 1
1
1
Brother 題解:NIM博弈結論:所有堆石子的異或和為0,先手必敗; 參考代碼:
1022: [SHOI2008]小約翰的遊戲John
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3459 Solved: 2234
[Submit][Status][Discuss]
Description
小約翰經常和他的哥哥玩一個非常有趣的遊戲:桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取
的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石子,但不能一粒石子也不取,我們規定取到最後一
粒石子的人算輸。小約翰相當固執,他堅持認為先取的人有很大的優勢,所以他總是先取石子,而他的哥哥就聰明
多了,他從來沒有在遊戲中犯過錯誤。小約翰一怒之前請你來做他的參謀。自然,你應該先寫一個程序,預測一下
誰將獲得遊戲的勝利。
Input
本題的輸入由多組數據組成第一行包括一個整數T,表示輸入總共有T組數據(T≤500)。每組數據的第一行包
括一個整數N(N≤50),表示共有N堆石子,接下來有N個不超過5000的整數,分別表示每堆石子的數目。
Output
每組數據的輸出占一行,每行輸出一個單詞。如果約翰能贏得比賽,則輸出“John”,否則輸出“Brother”
,請註意單詞的大小寫。
Sample Input
23
3 5 1
1
1
Sample Output
JohnBrother 題解:NIM博弈結論:所有堆石子的異或和為0,先手必敗; 參考代碼:
/************************************************************** Problem: 1022 User: SongHL Language: C++ Result: Accepted Time:44 ms Memory:1288 kb ****************************************************************/ #include<bits/stdc++.h> using namespace std; int T,n,a; int main() { scanf("%d",&T); while(T--) { int ans=0,temp=0; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a); if(a>1) temp=1; ans^=a; } if(!temp&&!ans || temp&&ans) printf("John\n"); else printf("Brother\n"); } return 0; }
BZOJ 1022: [SHOI2008]小約翰的遊戲John