题解:AcWing 892 台阶-Nim游戏

【题目来源】

AcWing:892. 台阶-Nim游戏 - AcWing题库

【题目描述】

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

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

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

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

【输入】

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

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

【输出】

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

否则,输出 No

【输入样例】

3
2 1 3

【输出样例】

Yes

【解题思路】

image

image

【算法标签】

《AcWing 892 台阶-Nim游戏》 #数学知识# #博弈论# #Nim游戏#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100005; // 定义常量 N,表示数组的最大长度

int main()
{
    int n; // 定义整数 n,表示数组的长度
    cin >> n; // 输入数组的长度
    int x = 0; // 初始化异或结果为 0
    for (int i = 1; i <= n; i++) { // 遍历数组
        int a; // 定义变量 a,表示当前元素
        cin >> a; // 输入当前元素
        if (i % 2) x ^= a; // 如果当前下标是奇数,将 a 与异或结果进行异或
    }
    if (x != 0) cout << "Yes" << endl; // 如果异或结果不为 0,输出 Yes
    else cout << "No" << endl; // 否则输出 No
    return 0; // 程序结束
}

【运行结果】

3
2 1 3
Yes
posted @ 2026-02-25 07:49  团爸讲算法  阅读(2)  评论(0)    收藏  举报