HDU2177:取(2堆)石子游戏(威佐夫博弈)
5 8
4 7
2 2
0 0
1
4 7
3 5
0
1
0 0
1 2
明显的威佐夫博弈题
其实这道题的关键就在于对威佐夫博弈的理解
首先我们来看这道题所涉及的一部分威佐夫博弈的主要知识点
0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,
由此我们可以进行一次奇异状态的打表,再枚举所有的状态即可
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <algorithm>
using namespace std; int ans[1000005][2],len;
int hash[2000005];
map<int,map<int,int> > vis; int main()
{
int a,b,i,j,pos;
memset(hash,0,sizeof(hash));
hash[0] = 1;
double k = (sqrt(5)-1.0)/2.0;
ans[0][0] = ans[0][1] = 0;
len = 1;
for(i = 1; i<=1000000; i++)
{
a = i;
j = a*k;
if(a != (int)(j*(1+k)))
j++;
b = a+j;
if(b>1000000)
break;
if(hash[a])
continue;
ans[len][0] = a;
ans[len][1] = b;
hash[a] = hash[b] = 1;
len++;
}
while(~scanf("%d%d",&a,&b),a+b)
{
vis.clear();
if(a>b)
swap(a,b);
j = a*k;
if(a != (int)(j*(1+k)))
j++;
if(a+j == b)
printf("0\n");
else
{
printf("1\n");
if(a == b)//相同可以取完
{
printf("0 0\n");
vis[0][0] = 1;
}
else//我们知道b = a+k,并且可以发现,在奇异状态之中,a,b的差正好就是其位于数组的下标,由此我们可以突出这个状态
{
int k = b-a;
if(b-ans[k][1]==a-ans[k][0]&&b-ans[k][1]>0&&a-ans[k][0]>0)
printf("%d %d\n",ans[k][0],ans[k][1]);
vis[ans[k][0]][ans[k][1]]=1;
}
for(i = 0; i<len; i++)//剩下的就是简单的枚举了,由于奇异状态中,后面的是大的,所以当a在后面出现的话就枚举完了
{
if(a == ans[i][0] && !vis[ans[i][0]][ans[i][1]])
printf("%d %d\n",ans[i][0],ans[i][1]);
if(a == ans[i][1] && !vis[ans[i][0]][ans[i][1]])
{
printf("%d %d\n",ans[i][0],ans[i][1]);
break;
}
}
}
} return 0;
}
HDU2177:取(2堆)石子游戏(威佐夫博弈)的更多相关文章
- HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- HDU2177取(2堆)石子游戏---(威佐夫博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2177 取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) M ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- nim3取石子游戏 (威佐夫博弈)
http://www.cnblogs.com/jackge/archive/2013/04/22/3034968.html 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有 ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- 洛谷P2252 取石子游戏(威佐夫博弈)
题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- hdu1527取石子游戏(威佐夫博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- P2252 取石子游戏 威佐夫博弈
$ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
随机推荐
- JS动态特性
var arr=[]; arr['js']='jquery'; arr['css']='oocss'; var obj={}; for(var i in arr) { obj[i]=arr[i]; } ...
- GPS(2)关于位置的3个示例,实时获取GPS定位数据,求两个经纬点距离,邻近某个区域圆时警告
实时获取GPS定位数据 import android.app.Activity; import android.content.Context; import android.location.Loc ...
- poj 1259 Agri-Net(最小生成树)
题目:http://poj.org/problem?id=1258 题意:模板题 和2485差不多 就是求相连后的最小值. #include <iostream> #include< ...
- 扫描.net dll引用dll
最近升级系统里的NHibernate,从3.3到4,项目工程太多, 一个模块分bll,dal,model,web,test,10几个模块,就要60多dll,升级一次太头疼. 编译过后,有时候会有的dl ...
- APIO2012派遣
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1196 Solved: 586[Submit ...
- 移动端web页面使用position:fixed问题
在做移动端项目时,碰到一个很纠结的问题,头部固定的问题,一开始使用fixed,发现一系列的问题, 问题1:footer输入框 focus 状态,footer 被居中,而不是吸附在软键盘上部. 测试环境 ...
- system CPU占用率过高与91助手的关系
今天正在认真工作,忽然发现电脑越来越慢. 按 CTRL+ALT+DEL打开任务管理器看了下CPU使用率.其中system占用率居然达到了64%.不对劲儿,按照平时习惯,system根本占用了不要这么多 ...
- Java序列化 如何把多个对象存储在一个文件中
/** * 用于保存模板文件,内容包括: * 1,标志位,1 int * 2,版本 1 int * 3,数据头长度 1 int * 4,预留数据头空间 5120 byte * 5,后续数据长度 ...
- MemoryMappedFile 内存映射文件 msdn
http://msdn.microsoft.com/zh-cn/library/dd997372%28v=vs.110%29.aspx 内存映射文件 .NET Framework 4.5 其他版本 1 ...
- HDU 5965 Gym Class 贪心+toposort
分析:就是给一些拓补关系,然后求最大分数,所以贪心,大的越靠前越好,小的越靠后越好 剩下的就是toposort,当然由于贪心,所以使用优先队列 #include <iostream> #i ...