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

我怎么什么都不会啊\(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;
}

posted @ 2019-10-31 23:42  呢没理他  阅读(90)  评论(0编辑  收藏  举报