nyoj886 取石子(八) 威佐夫博弈
好累,坐了一天火车,
终于到学校了。
思路:仔细观察威佐夫博弈,发现P态的所有数字都是不重复的,例如(0,0)、(1,2)、(3,5)、(4,7)、(6,
10)、(8,13)、(9,15)、(11,18)、(12,20)。而且威佐夫博弈中如果(a, b)是P态,那么满足a == (int)((b - a)*(√5 + 1) / 2),那么如果知道a或则b就能计算出b或者a,注意这里有取整,无法准确地得到答案,此时假设我们已经知道了a,那么b=a*(√5+1)/2,此时的b不一定是正确的b,因为会有误差,所以可以枚举[b-5, b+5]区间的所有数,来得到正确的b,同理有b得到a也是同样的道理,这是单独取一堆石子的情况。
对于同时在两堆石子取的情况,两堆石子的差(b-a)是定值,那么很容易得到准确地a,a加上差就是b,注意虽然可以得到a和b,但是可能a和b比原本给定的a和b大,这是不合理的。
总的复杂度是O(1)。
AC代码
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = 1e4 + 5; const double g = sqrt(5.0)+1; bool is_ok(int a, int b) { int c = b - a; if(a == (int)(c * g / 2)) return true; //P return false; //N } int main() { int a, b; while(scanf("%d%d", &a, &b) == 2) { if(!a && !b) break; int x = min(a, b), y = max(a, b); a = x, b = y; if(is_ok(a, b)) { printf("0\n"); continue; } else printf("1\n"); //change a and b int c = b - a; int aa = (int)(c * g / 2); if(aa < a && aa+c < b)printf("%d %d\n", aa, aa + c); // change b && tb >= a int tb = (int)(a * g / 2); for(int i = max(a, tb - 5); i < min(b, tb + 5); ++i){ if(is_ok(a, i)) { printf("%d %d\n", a, i); break; } } // change b && tb < a tb = (int)(2 * a / g); for(int i = max(0, tb - 5); i < min(a, tb + 5); ++i ) { if(is_ok(i, a)) { printf("%d %d\n", i, a); break; } } if(a != b) { int ta = (int)(b * 2 / g); for(int i = max(0, ta - 5); i < min(a, ta + 5); ++i) { if(is_ok(i, b)) { printf("%d %d\n", i, b); break; } } } } return 0; }
如有不当之处欢迎指出!
nyoj886 取石子(八) 威佐夫博弈的更多相关文章
- 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= ...
- POJ1067 取石子游戏 威佐夫博弈 博弈论
http://poj.org/problem?id=1067 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可 ...
- HDU2177:取(2堆)石子游戏(威佐夫博弈)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
- HDU - 5973 Game of Taking Stones (威佐夫博弈 高精度)
题目描述: Two people face two piles of stones and make a game. They take turns to take stones. As game r ...
随机推荐
- MyEclipse中设置注释模板的方法
1.选择菜单Window→Preferences. 2.选择Java→Code style→Code Templates→Commets.选中具体的分类如Methods,点击右侧的Edit可以设置对应 ...
- keytool 错误:java.to.FileNotFoundException:
老是报如题的错误: 后来才知道是因为当前的目录下没有写的权限,所以需要指定一个路径来存放android.key: keytool -genkey -alias android.key -keyalg ...
- JDBC (三)
1 数据库连接池的原理 应用程序直接获取Connection的缺点: 缺点:用户每次请求都需要向数据库获取连接,而数据库创建连接通常需要消耗相对较大的资源,创建的时间较长.如果一个网站一天访问量是10 ...
- func_get_args 获取一个函数的所有参数
func_get_args 获取一个函数的所有参数 { $numargs = func_num_args(); //参数数量 echo "参数个数是: $numargs&l ...
- Lambda表达式详解 (转)
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自C#1.0后新增的最重要的功能之一 ...
- 配置redis开机自启动和监听
redis安装好后,每次手动启动很不方便,配置开机自启动. 方法一:设置启动命令到/etc/rc.d/rc.local rc.local文件是系统全局脚本文件,会在其他开机进程脚本文件执行完毕后执行该 ...
- DIV+CSS中的滤镜和模糊
在div+css中,经常会用到div和span 当内容比较多的时候,会用到div 当内容比较少的时候,会用到span 来看下面的代码: <!DOCTYPE html> <html&g ...
- Android+TensorFlow+CNN+MNIST 手写数字识别实现
Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...
- XBIM 基于 WexBIM 文件在 WebGL 浏览和加载
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- xBIM 日志操作
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...