台阶Nim

题目描述
在这里插入图片描述
和Nim问题类似
在这里插入图片描述
假设有三级台阶。如果先手把2上的石子往1台阶上拿,那么后手就在台阶1上拿同样数量的石子到地上;如果先手把台阶3的石子往台阶2上拿,那么后手就把同样多的石子从台阶1往平地上拿。第1阶上的石子数量和第3阶的相同。那么也总是先手会面对第一阶石子为0的局面。

一般情况:如果先手面对的状态是全0,他在奇数台阶上往下拿石子个数为n, 后手只要将先手拿下来的石子顺次往下拿,就能使状态2又变为状态1,即全为0的状态;

只需要处理奇数台阶就可以了。

#include<iostream>
using namespace std;
int n;
int a;
int main(){
    
    
    cin >> n;
    int res = 0;
    for(int i = 1; i <= n; i++)
    {
    
    
        cin >> a;
        if(i % 2 == 1) res ^= a;//只关心奇数台阶
    }
    if(res) puts("Yes");
    else puts("No");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44879626/article/details/108296576
Nim