Hdu 1907 && Hdu2509 (nim博弈的相反胜况)

本文探讨了一种特殊的博弈问题——Anti-Nim游戏,与传统Nim博弈不同,该游戏中先取完石子的玩家判负。文章给出了获胜条件:先手玩家获胜的情形包括所有堆石子数量均为1且游戏的SG值为0,或存在某堆石子数量大于1且游戏的SG值不为0,并提供了相应的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般的nim博弈都是最后取完者算赢。而有些相反的恰是取完算输。

http://acm.hdu.edu.cn/showproblem.php?pid=1907

http://acm.hdu.edu.cn/showproblem.php?pid=2509

这题与以往的博弈题的胜负条件不同,谁先走完最后一步谁输,但他也是一类Nim游戏,即为anti-nim游戏。

首先给出结论:先手胜当且仅当 ①所有堆石子数都为1且游戏的SG值为0(即有偶数个孤单堆-每堆只有1个石子数);②存在某堆石子数大于1且游戏的SG值不为0.

证明

  1. 若所有堆都为1SG值为0,则共有偶数堆石子,故先手胜。
  2. i)只有一堆石子数大于1时,我们总可以对该石子操作,使操作后堆数为奇数且所有堆的石子数均为1

    ii)有超过一堆的石子数1时,先手将SG值变为0即可,且总还存在某堆石子数大于1

因为先手胜。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
using namespace std;
#define LL __int64
int main()
{
	int T,n,i,x;
	while(~scanf("%d",&n))
	{
		int ans=0,t=0;
		for (i=1;i<=n;i++)
		{
			scanf("%d",&x);
			ans^=x;
			if (x>1) t=1;
		}
		if (t==0)
		{
			if (n & 1) puts("No");
			else puts("Yes");
		} 
		else if (ans) puts("Yes");
		else puts("No");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值