78.Acwing基础课第892题-简单-台阶-Nim游戏

78.Acwing基础课第892题-简单-台阶-Nim游戏

题目描述

\(现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 a_i 个石子(i≥1)\)

\(两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)\)

\(已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败\)

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

输入格式

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

\(第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 a_i\)

输出格式

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

否则,输出 No

数据范围

\(1≤n≤10^5\),
\(1≤a_i≤10^9\)

输入样例:

3
2 1 3

输出样例:

Yes

代码:

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

using namespace std;

// 常量定义:N=100010,适配输入数据的最大规模(支持n≤1e5)
const int N = 100010;

int main()
{
    int n; // n:游戏中堆的总数(堆按1~n顺序编号)
    scanf("%d", &n); // 输入堆的数量

    int res = 0; // 存储奇数位置堆的异或结果(核心判断值)
    // 遍历每一堆(i为堆的编号,从1开始)
    for (int i = 1; i <= n; i ++ )
    {
        int x; // x:当前堆的石子数量
        scanf("%d", &x); // 输入当前堆的石子数
        
        // i & 1:判断堆的编号是否为奇数(等价于i%2==1)
        // 仅对奇数位置的堆做异或累积(偶数位置堆不参与判断)
        if (i & 1) res ^= x;
    }

    // 胜负判断规则(同尼姆游戏,但仅基于奇数堆的异或和):
    // res≠0 → 先手有必胜策略(输出Yes)
    // res=0 → 先手必败(输出No)
    if (res) puts("Yes");
    else puts("No");

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