题解 P4279 【[SHOI2008]小约翰的游戏】

Nemlit

2019-10-22 08:05:24

Solution

~~我怎么什么都不会啊$QAQ$博弈论怎么和期望一样玄学啊$QAQ$~~ 我们分几种情况讨论: $Case1$:只有一堆且为1,那么后手胜利 $Case2$:每一堆都是1,那么只需要判断奇偶性,奇数则先手败,偶数则后手败 $Case3$:只有一堆不是1,其余堆都是1,那么可以根据就行,先手可以选择是拿完或是那得只剩一个 $Case4$:一般情况,思考怎么转化成$Case\ 1-3$ 现在题意是说:给定K堆,先手想要自己去到最后一堆他就会胜利$(Case3)$,这不就变成$nim$游戏了吗? 于是只需要把每一堆的权值异或起来即可 ## $Code:$ ``` #include<bits/stdc++.h> using namespace std; int read() { int x = 0, f = 1; char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar(); return x * f; } int main() { int T = read(); while(T --) { int n = read(), x, ans = 0, sum = 0; for(int i = 1; i <= n; ++ i) x = read(), ans ^= x, sum += x; if(sum == n) puts(n & 1 ? "Brother" : "John"); else puts(ans ? "John" : "Brother"); } return 0; } ```