hdu 2177 取(2堆)石子游戏 博弈论
由于要输出方案,变得复杂了。数据不是很大,首先打表,所有whthoff 的奇异局势。
然后直接判断是否为必胜局面。
如果必胜,首先判断能否直接同时相减得到。这里不需要遍历或者二分查找。由于两者同时减去一个数,他们的差不变,而且ak=k*(sqrt(5)+1),bk=ak+k;
则可以通过二者的差直接定位,然后判断。
对于另外一种情况,其中一个减去某个数,得到奇异局势,则是分情况二分查找。
注意一些细节
代码如下:
#include<stdio.h>
#include<cmath>
#include<algorithm>
#define M 1000002
using namespace std;
int a[M/],b[M/],cnt;
void fun1(int n,int m)
{
int l=,r=cnt,mid;
while(l<=r){
mid=(l+r)>>;
if(n==a[mid]){
if(m>b[mid])
printf("%d %d\n",a[mid],b[mid]);
return;
}
if(n>a[mid])
l=mid+;
else r=mid-;
}
}
void fun2(int n,int m)
{
int l=,r=cnt,mid;
while(l<=r){
mid=(l+r)>>;
if(n==b[mid]){
if(m>a[mid])
printf("%d %d\n",a[mid],b[mid]);
return;
}
if(n>b[mid])
l=mid+;
else r=mid-;
}
}
int main(){
int n,m,i;
for(i=;i<=;i++){
a[i]=(int)(i*(sqrt(5.0)+1.0)/2.0);
b[i]=a[i]+i;
if(b[i]>=){
cnt=i;
break;
}
}
while(scanf("%d%d",&n,&m)&&(n+m)){
if(n<m) swap(n,m);
int t=(int)((n-m)*(sqrt(5.0)+)/2.0);
if(m==t) printf("0\n");
else{
printf("1\n");
if(n-m<cnt&&m-a[n-m]==n-b[n-m])
printf("%d %d\n",a[n-m],b[n-m]);
fun1(m,n);
if(n!=m) fun1(n,m);
fun2(m,n);
if(n!=m) fun2(n,m);
}
}
return ;
}
hdu 2177 取(2堆)石子游戏 博弈论的更多相关文章
- HDU 2177 取(2堆)石子游戏
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 2177 取(2堆)石子游戏(威佐夫博奕)
题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...
- HDU 2177 取(2堆)石子游戏 (威佐夫博弈)
题目思路:威佐夫博弈: 当当前局面[a,b]为奇异局时直接输出0 否则: 1.若a==b,输出(0 0): 2.将a,b不停减一,看能否得到奇异局,若有则输出: 3.由于 ak=q*k(q为黄金分割数 ...
- HDU 2176 取(m堆)石子游戏(Nim)
取(m堆)石子游戏 题意: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,1 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 2176 取(m堆)石子游戏 (尼姆博奕)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...
- HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly
HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...
- hdu 2176 取(m堆)石子游戏 (裸Nim)
题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...
- HDU 2117 取(2堆)石子游戏【wzf博弈】
题意:威佐夫博弈原型,除了输出先手能不能胜,还要输出先手的第一手选择. 思路:预处理出1000000以内的所有奇异局势.对于每个自然数,其必然是某一个奇异局势的a或者b.故对于一个非奇异局势,必定有一 ...
随机推荐
- Base64加密
实际开发中可能需要使用到可解密的加密方式,例如客户端记住用户的密码,客户端不能记住明文密码,那就需要对明文密码进行加密,然后在表单提交之后先对密码进行解密,在进行MD5加密和数据库中的密码进行比较实现 ...
- callback调用测试
<html> <head> <script> var context="全局"; var testObj={ context:"初始& ...
- mvc涉及到input设置了disabled
在做网站管理后台的用户修改功能时,由于当前用户修改个人信息时规定用户名不能修改,故使用了input标签的disabled属性,但是在提交数据后却发现用户名显示为空了.后来一查才知道input设置为di ...
- CentOS配置VSFTP服务器
[1] 安装VSFTP [root@localhost ~]# yum -y install vsftpd [2] 配置vsftpd.conf文件 [root@localhost ~]# vi /et ...
- Thinkphp整合最新Ueditor编辑器
说到最新的富文本编辑器的确不少(ckeditor.fkeditor.ueditor),这些富文本编辑器如果单独使用基本上很方便,不需要做额外的配置,只要把官方的插件下载下来放到一个web容器中,看看 ...
- 我的第一个MVC4程序
InputExtensions 方法解释 http://blog.csdn.net/cnceohjm/article/details/8936669 https://msdn.microsoft.co ...
- JavaScript中使用console调试程序的坑
上DEMO a = {key1: [1, 2], 'key2': {'key4': '11'}, 'key3': [1, 2]} console.info(1,a) a.key2.key4 = '22 ...
- Windows 10 响应式设计和设备友好的开发
使用Effective pixels有效像素设计UI 什么是缩放像素和Effective有效像素: 当你的应用程序运行在Windows的设备,系统用一个算法控制的规范,字体,和其他UI元素显示在屏幕上 ...
- Module模式 - 深入了解Javascript
/* Modelu模式 优点:效率高,代码少,加载速度快,松耦合允许并行加载,提升下载速度 缺点:初始化时间久一点 */ //一.基础用法 var calculate = function (eq) ...
- trie树(前缀树)
问题描述: Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...