codeforces 768 E Game of Stones(博弈)

106 篇文章 0 订阅
51 篇文章 0 订阅

题意:

算是nim的变形题吧

给n堆石子,在一堆石头上取的石头数量只能去一次,比如你在一堆石子上取了了4个石子,那么接下里你就不能在这堆石子上取4个石子了.问后手是否必胜.


解题思路:

如果没有最后那个条件,那就是普通的nim,我们去求每堆石子的数量的亦或和即可.

但是这里明显是不行的.考虑到nim中石子数量其实就是最多能取石子的步数,最后的亦或和也就是最大步数的亦或和,我们可以去求下这个游戏中每堆石子最多能取的步数,这样就能转换为普通的nim了.每堆石子最多能取的步数就好好求了,每堆石子我们按1,2,3,4..n的顺序去取石子,当剩下的石子小于等于n的时候,就不能再取了,所以n就是最大步数,然后我们去求下亦或和就可以.亦或和非0的话,先生必胜,即后手必败,亦或和0反之.


代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main()
{
     int n;
     int i, x, j, sum, ans;
     cin>>n;
     
     for(i=0; i<n; i++)
     {
	scanf("%d", &x);
	for(j=1, sum=0; j<=60; j++)
	{
	   x-=j;
	   if(x<=j)break;
	}
	a[i]=j;//最大步数
	ans=i==0?a[i]:ans^a[i];
     }
     if(ans)printf("NO");
     else printf("YES");

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值