hdu 1527 (威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527
8 4
4 7
问题:首先有两堆石子,博弈双方每次可以取一堆石子中的任意个,不能不取,或者取两堆石子中的相同个。先取完者赢。
分析:首先我们根据条件来分析博弈中的奇异局势
第一个(0 , 0),先手输,当游戏某一方面对( 0 , 0)时,他没有办法取了,那么肯定是先手在上一局取完了,那么输。
第二个 ( 1 , 2 ),先手输,先手只有四种取法,
1)取 1 中的一个,那么后手取第二堆中两个。
2)取 2 中一个,那么后手在两堆中各取一个。
3)在 2 中取两个,那么后手在第一堆中取一个。
4)两堆中各取一个,那么后手在第二堆中取一个。
可以看出,不论先手怎么取,后说总是能赢。所以先手必输!
第三个 ( 3 , 5 ),先手必输。首先先手必定不能把任意一堆取完,如果取完了很明显后手取完另一堆先手必输,那么
假如看取一堆的情况,假设先手先在第一堆中取。 取 1 个,后手第二堆中取4个,变成(1 ,2)了,上面分析了是先手的必输局。
取 2 个,后手第二堆中取3个,也变成( 1 , 2)局面了。
假设先手在第二堆中取,取 1 个,那么后手在两堆中各取 2 个,也变成 ( 1 , 2 )局面了。
取 2 个 ,那么后手可以两堆中都去三个, 变成 ( 0 , 0)局面,上面分析其必输。
取 3 个,后手两堆各取 1 个 ,变成( 1 , 2)局面了。
取 4 个,后手在第一堆中取一个,变成( 1 , 2)局面了。
可见不论先手怎么取,其必输!
第四个(4 , 7),先手必输。
自己推理可以发现不论第一次先手如何取,那么后手总是会变成前面分析过的先手的必输局面。
那么到底有什么规律没有呢,我们继续往下写。
第四个 ( 6 ,10 )
第五个 ( 8 ,13)
第六个 ( 9 , 15)
第七个 ( 11 ,18)
会发现他们的差值是递增的,为 0 , 1 , 2, 3, 4 , 5 , 6, 7.....n
而用数学方法分析发现局面中第一个值为前面局面中没有出现过的第一个值,比如第三个局面,前面出现了 0 1 2,那么第三个局面的第一个值为 3 ,比如第五个局面,前
面出现了 0 1 2 3 4 5 ,那么第五个局面第一个值为6。
再找规律的话我们会发现,第一个值 = 差值 * 1.618
而1.618 = (sqrt(5)+ 1) / 2 。
大家都知道0.618是黄金分割率。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!
下面来看看威佐夫博弈常见的三类问题:
1)给你一个局面,让你求是先手输赢。
有了上面的分析,那么这个问题应该不难解决。首先求出差值,差值 * 1.618 == 最小值 的话后手赢,否则先手赢。(注意这里的1.618最好是用上面式子计算出来的,否则精
度要求高的题目会错)
2)给你一个局面,让你求先手输赢,假设先手赢的话输出他第一次的取法。
首先讨论在两边同时取的情况,很明显两边同时取的话,不论怎样取他的差值是不会变的,那么我们可以根据差值计算出其中的小的值,然后加上差值就是大的一个值,当然能取的条件是求出的最小的值不能大于其中小的一堆的石子数目。假如在一堆中取的话,可以取任意一堆,那么其差值也是不定的,但是我们可以枚举差值,差值范围是0 --- 大的石子数目,然后根据上面的理论判断满足条件的话就是一种合理的取法。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m;
int main(){
while(cin>>n>>m){
if(n>m)swap(n,m);
double c=(sqrt(5.0)+)/2.0;
double cha=m-n;
int tmp=c*cha;
if(tmp==n)puts("");
else puts("");
}
return ;
}
hdu 1527 (威佐夫博弈)的更多相关文章
- hdu 1527 威佐夫博弈
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1527威佐夫博弈
//http://www.cnblogs.com/bo-tao/archive/2012/04/16/2452633.html #include<stdio.h> #include< ...
- hdu 2177 威佐夫博弈变形
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 1527 取石子游戏 (威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...
- 取石子游戏 HDU 1527 博弈论 威佐夫博弈
取石子游戏 HDU 1527 博弈论 威佐夫博弈 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两 ...
- HDU 1527 取石子游戏(威佐夫博弈)
基础威佐夫博弈,判断奇异局势即可,判断方式为k为两数之差绝对值,(sqrt(5) + 1) / 2 * k若等于两数小者则为奇异局势,也就是必败态. #include<stdio.h> # ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- 题解报告:hdu 1527 取石子游戏(威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...
- HDU 5973 Game of Taking Stones 威佐夫博弈+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5973 Game of Taking Stones Time Limit: 2000/1000 MS ...
随机推荐
- vue 使用sass 和less
npm i sass-loader --save -dev(-D)
- PHP中stdClass的意义
在WordPress中很多地方使用stdClass来定义一个对象(而通常是用数组的方式),然后使用get_object_vars来把定义的对象『转换』成数组. 如下代码所示: 1 2 3 4 5 ...
- [转帖]SPU、SKU、ID,它们都是什么意思,三者又有什么区别和联系呢?
SPU.SKU.ID,它们都是什么意思,三者又有什么区别和联系呢? http://blog.sina.com.cn/s/blog_5ff11b130102wx0p.html 电商时代,数据为王. 所以 ...
- 1228.Poor Pigs 可怜的猪
转自[LeetCode] Poor Pigs 可怜的猪 There are 1000 buckets, one and only one of them contains poison, the re ...
- WIndows下使用Grafana+InfluxDB打造监控系统
前言 对于一个运维DBA来说,了解数据库的TPS.QPS很有必要(QPS:每秒查询数,即对数据库每秒的DML的操作数:TPS:每秒事物处理,即对数据库每秒DDL操作数),通过了解他们,可以掌握一个实 ...
- Eclipse的一个“bug”
标题之所以打上双引号,是因为暂时不知道怎么确定. 一个 .java文件里有两个类:public Bath:Soap.它们都有一个main()方法. 从命令行单独访问任意一个类的main()方法,都没毛 ...
- IWMS后台上传文章,嵌入视频,调用优酷通用代码
<a href="http://player.youku.com/player.php/sid/XODcxNjM3OTYw/v.swf " target="_bla ...
- git放弃修改,强制覆盖本地代码
$ git fetch --all $ git reset --hard origin/master $ git pull
- qtp 自动化测试---点滴 获取属性性/修改窗体标题
1 GetROProperty获取对应属性值 value url (这里出错了) If Window("新增").WinObject("TRzDBEdit_10" ...
- 学习 Spring (三) Bean 的配置项 & 作用域
Spring入门篇 学习笔记 配置项 Id: 整个 IoC 容器中的唯一标识 Class: 具体实例化的类(必须配置项) Scope: 作用域 Constructor arguments: 构造器参数 ...