拆分-Nim游戏(字节手撕题)

简介: 拆分-Nim游戏(字节手撕题)

给定 n 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆规模更小的石子(新堆规模可以为 00,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。


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


输入格式

第一行包含整数 n。


第二行包含 n个整数,其中第 i 个整数表示第 i 堆石子的数量 ai。


输出格式

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


否则,输出 No。

数据范围

1≤n,ai≤100

输入样例:
1. 2
2. 2 3
输出样例:
Yes

思路:同集合-NIM一样可以得证所有的sg(i)异或为0是必败态,为一是必胜态。

不同点在于怎么去求sg(x),前者可以通过树状图的形式列出所有可能,后者可以通过两层for循环也可以实现所有可能的穷举。

完整代码:

#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;
const int N=110;
int f[N]; 
unordered_set<int> S;
int sg(int x){
    if(f[x]!=-1)return f[x];
    for(int i=0;i<x;i++)
        for(int j=0;j<=i;j++)
            S.insert(sg(i)^sg(j));
    for(int i=0;;i++){
        if(!S.count(i))return f[x]=i;
    }
}
 
int main(){
    int n;
    int res=0;
    cin>>n;
    memset(f,-1,sizeof f);
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        res^=sg(x);
    }
    if(res)cout<<"Yes";
    else cout<<"No";
    return 0;
}
 
 
 
 
 
 
 
 
 
相关文章
|
7月前
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
158 3
|
7月前
|
算法 C# 图形学
|
9月前
|
前端开发 JavaScript 程序员
程序员教你用代码制作3d爱心跳动特效,正好拿去送给女神给她个惊喜
使用HTML、CSS和JavaScript实现了一个三维网格采样器`MeshSurfaceSampler`,适用于任意浏览器,推荐谷歌。代码创建了一个类,从缓冲几何体的三角形网格中进行随机采样。提供了设置权重属性、构建分布和自定义随机数生成器的功能。用户只需将代码复制到文本文档并保存为HTML文件,即可运行。适合编程爱好者尝试,也可分享给他人。
274 1
|
开发者 Kotlin
变“鼠”为“鸭”——为SVG Path制作FIFO路径变换动画,效果丝滑
曾撰文《使用batik在kotlin中将TTF字体转换为SVG图像》介绍了如何将汉字转为SVG Path路径进行展示和变换,以此为基础用动画将一个汉字变为另一个汉字,感官上很好玩
346 0
|
图形学
【unity每日一记】——游戏剧情模式中MoveTowards和GameObject.Find()的应用
【unity每日一记】——游戏剧情模式中MoveTowards和GameObject.Find()的应用
118 0
刘金玉的零基础VB教程072期:贪吃蛇游戏开发第八节 总结 补充从尾部开始变长
刘金玉的零基础VB教程072期:贪吃蛇游戏开发第八节 总结 补充从尾部开始变长
107 0
|
Python 容器
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏05之滚动屏幕
通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏05之滚动屏幕
237 0
|
Python
python及pygame雷霆战机游戏项目实战11 玩家多条命
python及pygame雷霆战机游戏项目实战11 玩家多条命
138 0
|
移动开发 Dart
【新年快乐第二弹】在 Flutter 中使用交错网格视图创建瀑布流布局
马上过新年了,想好如何过年了吗?,今天我带大家在瀑布流布局中写新年快乐。 在 Web 和移动开发世界中,当我们想要显示大小不相同的项目网格时,瀑布流布局很有用。一个轴使用严格的网格布局,通常是列。在另一个轴上,项目具有不同的高度,但可以灵活排列以填满可用空间。使用瀑布流布局的一个著名例子是 Pinterest。他们为他们的网站和移动应用程序实现了这种布局,以显示不同大小的图像。
328 0