891. Nim游戏

我感觉好难理解,大致原理懂,但还不是完全的懂。

在这里插入图片描述
https://www.acwing.com/problem/content/893/

首先介绍两种状态 : 必胜状态和必败状态

  • 必胜状态: 先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。
    即先手可以走到某一个必败状态。也就是说当我进行操作后,后面的人无论如何搞都是必输的,那么对我来说这就是一个必胜状态。
  • 必败状态: 先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。
    先手走不到任何一个必败状态。也就是说当我进行操作后,后面的人无论如何搞都是必赢的,那么对我来说这就是一个必败状态。

结论:
假设n堆石子,石子数目分别是a1,a2,…,an,如果a1⊕a2⊕…⊕an≠0,先手必胜;否则先手必败。

这里有一个nim值的概念: nim=a1⊕a2⊕…⊕an
如果nim=0,表示这是一个平衡的状态,nim!=0表示这是一个不平衡的状态。只有这两种状态。

当先手此时的状态不是平衡态(即nim!=0)时,此时他进行操作一定可以将其转换为平衡态(即nim=0),因为只有这两种状态。
此时后手面对的是平衡态,无论他如何拿必定会打破平衡态(nim!=0),此时先手又遇到了不平衡态,依次往复,后手必输。

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main(void)
{
    int n; cin>>n;
    int x;
    int ans=0;
    for(int i=0;i<n;i++) cin>>x,ans=ans^x;
    if(ans==0)cout<<"No"<<endl;
    else cout<<"Yes"<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值