小清新博弈题solution

小清新博弈题

wzy是个lolita控。
一天他遇到了一个难办的情况:他的两只lolita吵起来了!

他的两只lolita的问题是这样的:
有一个苹果森林,有n棵苹果树。森林里的每棵苹果树上都结有ai个苹果。
lolita们非常喜欢吃苹果,所以她们为吃苹果制定了一个规则。
两只lolita轮流吃苹果。在一个lolita的回合里,她可以从这n棵树任意选择几个苹果吃掉,注意每个树每次只能摘掉一个苹果(不然树会很伤心)。她至少要选择一个苹果吃掉。
如果一只lolita把一棵树的最后一个苹果取了,树会十分难过。所以就判这只lolita 输了。
两只lolita都想赢得胜利,成为最受重视的lolita。因为wzy太强了,所以他的两只lolita都是绝顶聪明的。
问:对于给定的一个局面,是否存在先手必胜策略?

为了避免随机出奇迹,本题采用多组数据。
输入格式:
第1行一个数T, 代表数据的组数。
对于每组数据:
第1行一个数n,代表树的个数。
第i行(2<=i<=n+1)每行一个数x, 代表i这棵树上一开始有x个苹果。

输出格式:
你应该输出T行,分别代表每局游戏是否存在先手必胜策略。存在输出“YES”(不带双引号),不存在输出”NO“(不带双引号)

输入样例:
2
3
1 1 1
3
1 2 2

输出样例:
NO
YES

数据范围:
对于10% 的数据,满足 1<=T<=10。1<=n<=10。1<=c<=10。
对于50% 的数据,满足 1<=T<=10。1<=n<=200。1<=c<=2000。
对于100% 的数据,满足1<=T<=10。1<=n<=1e5。1<=c<=1e9。


题解:

考虑如果树上苹果都是偶数,那么任意操作一次后一定存在奇数。 如果树上苹果存在奇数,那么一定存在一种选法使得后继状态都是偶数。 所以把都是偶数看成必败状态,存在奇数看成必胜状态。

c o d e s : codes:

#include <cstdio>
int n, T;
int main() {
    //freopen("data.in", "r", stdin);
    //freopen("data.out", "w", stdout);
    scanf("%d", &T);
    while (T--) {
        int f = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) {
            int t; scanf("%d", &t);
            if (!(t & 1))f = 1;
        }
        puts(f ? "YES" : "NO");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hanjinbo/article/details/88290396