77.Acwing基础课第891题-简单-Nim游戏

77.Acwing基础课第891题-简单-Nim游戏

题目描述

\(给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败\)

\(问如果两人都采用最优策略,先手是否必胜\)

输入格式

\(第一行包含整数 n\)

\(第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量\)

输出格式

如果先手方必胜,则输出 Yes

否则,输出 No

数据范围

\(1≤n≤10^5\),
\(1≤每堆石子数≤10^9\)

输入样例:

2
2 3

输出样例:

Yes

代码:

// 包含基础输入输出、算法头文件
#include <iostream>
#include <algorithm>

using namespace std;

// 常量定义:N=100010,适配输入数据的最大规模(本题未直接使用,预留扩展)
const int N = 100010;

int main()
{
    int n; // n:游戏中堆的数量(或参与异或的数字个数)
    scanf("%d", &n); // 输入堆数

    int res = 0; // 存储所有数的异或结果(尼姆游戏的核心判断值)
    // 遍历每一堆(或每个数字)
    while (n -- )
    {
        int x; // x:当前堆的石子数量(或参与异或的数字)
        scanf("%d", &x); // 输入当前堆的石子数
        res ^= x; // 异或累积:res = res ^ x(异或的结合律不影响最终结果)
    }

    // 尼姆游戏胜负判断:
    // res≠0 → 先手有必胜策略(输出Yes)
    // res=0 → 先手必败(输出No)
    if (res) puts("Yes");
    else puts("No");

    return 0;
}
posted @ 2026-04-09 17:40  CodeMagicianT  阅读(1)  评论(0)    收藏  举报