HDU-1527 取石子游戏(威佐夫博弈)

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

Input

输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。

Output

输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。

Sample Inpu

t
2 1
8 4
4 7

Sample Output

0
1
0

思路

这道题考的就是威佐夫博弈了,作为一个合格的渣渣当然是不会知道这是什么玩意了,不过看了其他大佬的写的文章之后也算是略知一二。这道题的意思也就是当面对(0,0),(1,2)。。。。等等奇异局势的时候先手必输,比如:
当面对(1,2)的时候先手有以下的方法
1,先手从“1”当中拿一个,后手从“2”中拿两个,后手胜。
2,先手从“2”当中拿一个,后手可以把另外两个同时拿走,后手胜。
3,先手从“2”当中拿两个,后手从“1”当中拿一个,后手胜。
4,先手从“1,2”当中各拿一个,后手可以从“2”当中拿走一个,后手胜。
所以无论怎么操作,面对奇异局势,后手必胜,是不是后手很厉害!!
而奇异局势有一下情况:
第一种(0,0)
第二种(1,2)
第三种(3,5)
第四种 (4 ,7)
第五种(6,10)
第六种 (8,13)
第七种 (9 , 15)
第八种 (11 ,18)
第n种 (a[k],b[k])
而这时有规律可循的,每一组的差值0,1,2,3,4,5,6…很显然单调递增,而每一组前面那一个(默认是小的那个数字)是差值乘上1.618,而黄金分割率也就是(sqrt(5)-1)/2=0.618,所以这个地方就是我觉得最神奇的。所以面对奇异局势先手必输,而后面的各种奇异局势也都可以转化为第一种(1,2)的情况。

代码

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    int a,b,m,n;
    double j,k,t;
    while(cin>>a>>b)
    {
        j=(sqrt(5)+1)/2;//采用double型精确计算
        m=min(a,b);
        n=max(a,b);
        if((int)(j*(n-m))==m)cout<<"0"<<endl;doubleint相乘的时候结果是double,所以要强转
        else cout<<"1"<<endl;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值