博弈论-Nim游戏

题目描述

蓝桥公司给他们的员工准备了丰厚的奖金,公司主管小明并不希望发太多的奖金,他想把奖金留给智慧的人,于是他决定跟每一个员工玩一个游戏,规则如下:

  • 桌面上一共有 n 堆一元钱。
  • 双方轮流行动,由小明先行动,每次行动从某一堆钱中拿走若干元(至少一元钱),取走最后一元钱的人获胜。

请问员工们能拿到奖金吗?

输入描述

第一行为一个整数 T,表示测试数据数量。

每个测试用例包含俩行。第一行为一个整数 n , 第二行包括 n 个整数 a1,a2...an​ 表示第 i 堆有 ai​ 元。

保证所有测试用例的 nn 的和不超过 2×1052×105。

输出描述

如果员工能拿到奖金输出 YES​ , 否则输出 NO

输入输出样例

示例

输入

复制代码
3
2
1 1
1
1
3
2 2 1

输出

复制代码
YES
NO
NO

Nim游戏:

简介

有n堆不同的物品,这些堆中各自物品的数量是任意的。两名玩家轮流取走堆中物品,可以选择将某一堆中任意数量的物品拿走,至少1个,至多全部拿走,但不能不拿或跨堆拿取物品。最终,拿到最后一个物品的玩家获胜。

结论

若初态为必胜态(a1^a2^a3^......^an != 0),则先手必胜;

若初态为必败态(a1^a2^a3^......^an == 0),则先手必败。

两个定理

  1. 必胜态的后继状态至少存在一个必败态;
  2. 必败态的后继状态均为必胜态。

总结

如果先手获得的是必胜态(所有堆数量异或结果!=0),根据定理1,先手可以在一个堆中取一定数量使得给到对手的初态是必败态,又根据定理2,对手不论怎么取,最终回到你手上时仍然为必胜态(如果我初状态为必胜态,则我一定可以给下一个人制造一个必败态)。

代码实现

java 复制代码
import java.util.*;


public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int T=sc.nextInt();
        for (int i = 0; i < T; i++) {
            int n=sc.nextInt();
            int num=sc.nextInt();
            for (int j = 1; j < n; j++) {
                num^=sc.nextInt();
            }

            if (num==0) System.out.println("YES");
            else System.out.println("NO");
        }

        sc.close();
    }



}
相关推荐
zyplayer-doc16 分钟前
核心制度不该被随手修改:用zyplayer-doc锁定文档和全部子文档
大数据·数据库·人工智能·笔记·pdf·ocr
啄缘之间1 小时前
5.1 uvm‑component 的层级结构管理? new (name,parent) 参数
开发语言·笔记·学习·ic·uvm·sv
江屿风1 小时前
【科普】【差集&交集概念落地云相册】流食般投喂
开发语言·c++·笔记·算法·云相册
一米阳光866111 小时前
软考(中级)软件设计师核心笔记(6)系统开发基础——需求分析、系统设计
笔记·职场发展·需求分析·软考·软件设计师·中级职称
雨田言炎15 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
hanlin0316 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
摇滚侠16 小时前
SpringBoot 官网 阅读笔记 启用生产就绪功能 端点
spring boot·笔记·后端
AI云海17 小时前
完整机器学习工业项目流水线笔记
人工智能·笔记·机器学习
2601_9657996817 小时前
2026 在线笔试平台深度测评与选型指南:从功能、稳定性、AI能力、防作弊全面分析
人工智能·笔记·功能测试
xqqxqxxq17 小时前
SQL 连接查询技术笔记
数据库·笔记·sql