首页 > 其他分享 >acwing894. 拆分-Nim游戏

acwing894. 拆分-Nim游戏

时间:2022-09-22 20:12:11浏览次数:82  
标签:... Nim int 两堆 拆分 oplus include SG acwing894

acwing894. 拆分-Nim游戏

原题链接:https://www.acwing.com/problem/content/896/

思路

关于SG函数,mex操作,SG定理的一些知识

取走一堆放入两堆,好像总的堆数一直在增加,但是每次放入的两堆各堆的数量一定小于取走的那一堆的数量,可能到最后每次放入的两堆的数量都是0,所以是有终点的。

此题将每一堆石子看成独立的局面

将每堆石子看做独立的局面,即\(a_1、a_2、a_3...a_n\)个有向图游戏。

然后求每个局面的SG函数,\(SG(a_1)、SG(a_2)、SG(a_3)...SG(a_n)\),求其异或和

\(SG(a_1)\oplus SG(a_2)\oplus SG(a_3)\oplus ...\oplus SG(a_n)\neq 0\)则先手必胜
\(SG(a_1)\oplus SG(a_2)\oplus SG(a_3)\oplus ...\oplus SG(a_n)= 0\)则先手必败

对于每一个有向图\(a_1、a_2、a_3...a_n\)都存在如下情况:拿走\(a_k\),增加了\(b_1、b_2\)两堆石子,根据SG定理,\(SG(a_k) = SG(b_1)\oplus SG(b_2)\)

代码
#include<iostream>
#include<cstring>
#include<unordered_set>

using namespace std;

const int N = 110;

int f[N],a[N];
int n;

int SG(int x)
{
    // 如果已经计算过SG函数值的直接返回
    if(f[x] != -1) return f[x];
    
    unordered_set<int> S; // 记录这个图x中的所有SG函数值
    
    // 遍历所有可能
    for(int i = 0; i < x; i ++)
        for(int j = 0; j <= i; j ++) // 这里可以取等,遍历到i就行,因为会有重复
            S.insert(SG(i)^SG(j));
    
    // mex
    for(int i = 0;; i ++)
    {
        if(!S.count(i)) return f[x] = i;
    }
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i ++) cin >> a[i];
    
    memset(f,-1,sizeof f);
    
    int res = 0;
    for(int i = 0; i < n; i ++)
        res ^= SG(a[i]);
        
    if(res) puts("Yes");
    else puts("No");
    
    return 0;
}

标签:...,Nim,int,两堆,拆分,oplus,include,SG,acwing894
From: https://www.cnblogs.com/rdisheng/p/16720674.html

相关文章

  • acwing892. 台阶-Nim游戏
    acwing892.台阶-Nim游戏原题链接:https://www.acwing.com/problem/content/894/思路奇数台阶异或和不等于0先手必胜奇数台阶异或和等于0先手必败代码#include<iost......
  • 博弈论-acwing893.集合-Nim游戏
    补充知识有向图游戏给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿着有向边方向移动,每次可以移动一步,无法移动者判负。该游......
  • 博弈论-acwing891.Nim游戏
    博弈论acing891.Nim游戏原题链接:https://www.acwing.com/problem/content/893/公平组合游戏若一个游戏满足:1.由两名玩家交替行动2.在游戏进行的任意时刻,可以执行的合......
  • Minimum Money Required Before Transactions
    MinimumMoneyRequiredBeforeTransactionsYouaregivena0-indexed2Dintegerarray transactions ,where transactions[i]=[costi,cashbacki] .Thearray......
  • css简单动画 @-webkit-keyframes、-webkit-transform、webkit-animation的使用
    浏览器前缀IE10和Firefox(>=16)支持没有前缀的animation,firefox(<16)使用-moz-前缀,因为现在firefox的版本也都不低,所以firefox都直接使用没有前缀的animation。而chrome,safa......
  • [CG] 顶点动画贴图 (Vertex Animation Texture, VAT)
    什么是顶点动画?简单来说,通过改变网格顶点的位置,使网格变形从而做成的动画。顶点动画的灵活度要远远高于骨骼动画。骨骼动画是靠骨骼(一堆有层级结构的节点,数量应该是远远小......
  • Linux MiniMal版本常规所需环境安装
    环境说明:开始之前建议先拍摄快照、必免不必要的丢失VMware®Workstation16ProCentos7.9minimal版本(安装完成并未做任何操作)......
  • manim svg Transform
    Transform基于路径的条数来操作1、如果从n条路径Transform到n条路径,那么只有Transform效果(最佳效果)(这里的一条路径可以是闭合的,也可以是不闭合的,也可以是闭合但有分支的)2......
  • CSS制作移动动画效果--伪类+transition+ transform+ animation的使用
    一、常用概念:1.TransformTransform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等,它包含有以下属性:(1)矩阵matrix(2)移动translate(3)缩放s......
  • requestIdleCallback和requestAnimationFrame的区别
    页面流畅与FPS页面是一帧一帧绘制出来的,当每秒绘制的帧数(FPS)达到60时,页面是流畅的,小于这个值时,用户会感觉到卡顿。1s60帧,所以每一帧分到的时间是1000/60≈16ms。......