hdu1729尼姆博弈

尼姆博弈——对于n堆石子轮流取,先取完者胜,和这道题蛮像的


将这道题改造成尼姆博弈然后进行位运算


原题意为s个石子,取小于原有石子c的平方数个石子


转为每堆任意取小于find(s,c)个石子


int find(int s,int c)
{
    int p=sqrt(s+0.0);
    while(p+p*p>=s)
        p--;
    if(c>p)
        return s-c;
    else
        return find(p,c);
}

这一段,有很多讲解的,看了。。半懂半不懂

任意数p,p+p*p要小于s的最大p

然后。。如果c>p,这时先行者可以在s-c中任意拿,return ;

如果没有,就递归,至于为什么用p作s继续递归。。。不造欸。。


就酱吧,如果以后想明白了再来


#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<math.h>
using namespace std;
int find(int s,int c)
{
    int p=sqrt(s+0.0);
    while(p+p*p>=s)
        p--;
    if(c>p)
        return s-c;
    else
        return find(p,c);
}
int main()
{
    int count=1;
    int n;
    while(scanf("%d",&n)&&n)
    {
        int ans=0;
        int s,c;
        while(n--)
        {
            scanf("%d%d",&s,&c);
            ans^=find(s,c);
        }
        printf("Case %d:\n",count++);
        if(ans) puts("Yes");
        else puts("No");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值