取石子游戏

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3781    Accepted Submission(s): 1904

Problem Description
有两堆石子,数量随意,能够不同。

游戏開始由两个人轮流取石子。

游戏规定。每次有两种不同的取法,一是能够在随意的一堆中取走随意多的石子;二是能够在两堆中同一时候取走同样数量的石子。最后把石子所有取完者为胜者。如今给出初始的两堆石子的数目。如果轮到你先取,如果两方都採取最好的策略,问最后你是胜者还是败者。

 
Input
输入包括若干行。表示若干种石子的初始情况。当中每一行包括两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。
 
Output
输出相应也有若干行,每行包括一个数字1或0。假设最后你是胜者。则为1。反之,则为0。
 
Sample Input
2 1
8 4
4 7
 
Sample Output
0
1
0
解题思路:
看到这样的博弈题目。第一反应就是当中存在一定的内部规律:
这个游戏就是所谓的威佐夫博弈(Wythoff Game),果然够简单,够经典————“黄金切割! ! !”
观察这组数据:
************************************************
第一堆 第二堆(不区分两堆先后顺序) 差值
0 0 0
2 1 1
5 3 2
7 4 3
10 6 4
13 8 5
................................................
前几个必败点例如以下:(0,0),(1。2),(3,5),(4,7),(6。10)。(8,13)……
能够发现。对于第k个必败点(m(k),n(k))来说,
m(k)是前面没有出现过的最小自然数,
n(k)=m(k)+k
而:
m(k) = k * (1 + sqrt(5))/2
n(k) = m(k) + k
这两个公式不知道为什么是这样?好像是威佐夫博弈(Wythoff Game)的一部分
求大神解读... 

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const double q=(1+sqrt(5.0))/2.0;
int main()
{
int a,b,x,y;
while(~scanf("%d %d",&a,&b))
{
x=min(a,b);
y=a+b-x;
if(x==(int)((y-x)*q)
{
cout<<0<<endl;
}
else cout<<1<<endl;
}
return 0;
}

HDoj-1527-取石子游戏的更多相关文章

  1. hdu 1527 取石子游戏(Wythoff Game)

    题意:Wythoff Game 思路:Wythoff Game #include<iostream> #include<stdio.h> #include<math.h& ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...

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

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  4. 题解报告:hdu 1527 取石子游戏(威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...

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

    基础威佐夫博弈,判断奇异局势即可,判断方式为k为两数之差绝对值,(sqrt(5) + 1) / 2 * k若等于两数小者则为奇异局势,也就是必败态. #include<stdio.h> # ...

  6. 取石子游戏 HDU 1527 博弈论 威佐夫博弈

    取石子游戏 HDU 1527 博弈论 威佐夫博弈 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两 ...

  7. HDU-1527 取石子游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=1527 交换  :可实现. if( n < m ) { n^=m; m^=n; n^=m; } (三)尼姆博 ...

  8. Games:取石子游戏(POJ 1067)

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37662   Accepted: 12594 Descripti ...

  9. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  10. HDU 2516 取石子游戏(FIB博弈)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. (译)Node.js的 EventEmitter 教程

    原文标题:Node.js EventEmitter Tutorial 原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.htm ...

  2. (转)原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  3. Redis的入门Demo(java)

    java代码部分参考了:http://www.runoob.com/redis/redis-java.html 在java中使用Redis,需要引入Redis驱动,就是jedis-2.1.0.jar, ...

  4. 打印 PHP $_SERVER 常量

    foreach( $_SERVER as $var => $value){ echo $var.' '.$value.'<br>'; };

  5. iOS 之播放系统声音

    导入框架: 代码: #import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h> @interface MsgPl ...

  6. [转] IOS中AppDelegate中的生命周期事件的调用条件

    IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...

  7. 【转】context和getApplicationContext()介绍

    在android中常常会遇到与context有关的内容,大多都是作为参数在传递,但是它的作用究竟是什么呢 先说它的用法,举个例子 在语句 AlertDialog.Builder builder = n ...

  8. 调不尽的内存泄漏,用不完的Valgrind

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-X.X.X.tar.bz2 2. 解压安装包:tar –jxvf ...

  9. setTimeout 虚假的“异步”

    看这篇http://www.laruence.com/2009/09/23/1089.html 所以实际上 setTimeout更像是任务按照队列执行  经过setTimeout设置后任务放在了队尾 ...

  10. 使用libcurl POST数据和上传文件

    为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度.fc也可以是任何其它内容.curl 是 libcurl句柄.演示省略了很多显而易见的步骤.   1. 普通的post请求,这里用c ...