[原博客] POJ 1067 取石子游戏
题目链接
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。(中文题面,感动ing)
但是这道题实在是呵呵。
开始没啥思路,根据必胜状态必败状态的定义,n^3打了个表,看起来是这样的。

图为100x100,已经缩小,左上角是状态(0,0),右下角状态为(100,100),黄色标出的是必败状态。(哇,博客还能传图,真好~)
嗯,对称是显然的吧,因为这两堆可以直接交换,而且看起来很有规律的样子。
T_T找不到规律。
后来知道这个叫“威佐夫博奕(Wythoff Game)”。百科
这个问题中必败状态叫奇异局势(奇异~),然后可以有公式去算,好像还与黄金分割有半毛钱关系,具体看百科证明吧。
规律摘抄如下:
- 任何自然数都包含在一个且仅有一个奇异局势中。
- 任意操作都可将奇异局势变为非奇异局势。(必败状态)
- 采用适当的方法,可以将非奇异局势变为奇异局势。(必胜状态)
- 如果用
(ak,bk)表示一个状态,设ak<=bk,则有a0=b0=0,ak是未在前面出现过的最小自然数,且bk=ak+k。
公式:ak =[k(1+√5)/2],bk= ak + k(k=0,1,2,...,n 方括号表示取整函数)。
做法:如果对于(a,b)是奇异局势的话,应该有k=b-a,然后根据k计算出a等不等于ak即可,若相等,该状态为奇异局势,必败输出0,否则输出1。
*涨姿势。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
//by zrt
//problem:
using namespace std;
typedef long long LL;
const int inf(0x3f3f3f3f);
);
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
double sqrt5=sqrt(5.0);
int a,b;
while(~scanf("%d%d",&a,&b)){
if(a>b) swap(a,b);
int j=b-a;
+sqrt5)/2.0);
");
");
}
;
}
[原博客] POJ 1067 取石子游戏的更多相关文章
- POJ.1067 取石子游戏 (博弈论 威佐夫博弈)
POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...
- poj 1067 取石子游戏 (威佐夫博弈)
取石子游戏 http://poj.org/problem?id=1067 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆 ...
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
- Poj 1067 取石子游戏(NIM,威佐夫博奕)
一.Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. ...
- POJ 1067 取石子游戏 (威佐夫博奕,公式)
题意: 有两堆石子,两个人轮流取石子.规定每次有两种取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.给定两堆石子数量,问先手的输赢? ...
- POJ 1067 取石子游戏
题意:有两堆个数分别为a和b的石子,两个人轮流取石子,一次可以取一堆中任意个数的石子,或者在两堆中取相同个数的石子,最先没有石子可以取的人输,你先取,赢为1输为0. 解法:威佐夫博弈.看完题先找规律, ...
- poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
这里不在详细介绍威佐夫博弈论 简单提一下 要先提出一个名词“奇异局势”,如果你面对奇异局势则必输 奇异局势前几项(0,0).(1,2).(3,5).(4,7).(6,10).(8,13).(9,15) ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
- POJ 1067 取石子游戏 [博弈]
题意:威佐夫博弈. 思路:看了很多证明都没看懂.最后决定就记住结论好了. 对于所有的奇异局面(必败局),有通项公式 Pi = (a, b), (a = i * [(sqrt(5) + 1) / 2], ...
随机推荐
- hdu1715(Java)大数相加
大菲波数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...
- Android5.0之TextInputLayout、FloatingActionButton的使用
TextInputLayout和FloatingActionButton都属于MD风格的控件,比起普通的EditText和Button.ImageButton,TextInputLayout和Floa ...
- Android(java)学习笔记146:Bundle和Intent类使用和交互
Bundle只是一个信息的载体 将内部的内容以键值对组织 ,Intent负责Activity之间的交互自己是带有一个Bundle的.Intent.putExtras(Bundle bu ...
- PHPinstanceof filal这几个关键字的使用
instanceof表示属不属于的意思 eg: class person{} class Student extends person{} $s=new person(); $st=new stude ...
- r2d_01
- maven跳过单元测试
24.跳过单元测试 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>mav ...
- 高性能web站点建设(一)
一.等待 客户端发送请求到服务端相应请求的过程,是需要等待的,而等待时间的长短通常是衡量这个网站“快慢”的重要指标,在这等待的时间里,到底发生了什么?概括来说经历了以下几个部分时间: 数据在网络上传输 ...
- 20151216JqueryUI---dialog代码备份
$(function () { $('#search_button').button(); /*$('#reg').dialog({ focus:function(e,ui){ alert('注册') ...
- hdoj1874 (优先队列+Dijkstra)
hdoj1874 分析: 一看题目, 就是求最短路, 这道题用的是Dijkstra+优先队列.先说一下Dijkstra算法:每次扩展一个距离最短的节点, 更新与其相邻点的距离. 当所有边权都为正时, ...
- action方法不返回
当被请求的action方法中还有资源没有释放时,请求方法是不会返回的,会一直停留在方法中,即使是最后一行,因为请求方法一旦返回,那方法中的资源,引用就没有位置住了,所以所请求的方法会一直不返回,直到方 ...