好累,坐了一天火车,
终于到学校了。

思路:仔细观察威佐夫博弈,发现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 取石子(八) 威佐夫博弈的更多相关文章

  1. nim3取石子游戏 (威佐夫博弈)

    http://www.cnblogs.com/jackge/archive/2013/04/22/3034968.html 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有 ...

  2. HDU 1527 取石子游戏(威佐夫博弈)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  4. hdu1527取石子游戏(威佐夫博弈)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. P2252 取石子游戏 威佐夫博弈

    $ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...

  6. POJ 1067 取石子游戏 威佐夫博弈

    威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...

  7. POJ1067 取石子游戏 威佐夫博弈 博弈论

    http://poj.org/problem?id=1067 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可 ...

  8. HDU2177:取(2堆)石子游戏(威佐夫博弈)

    Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...

  9. poj 1067 取石子游戏( 威佐夫博奕)

    题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...

  10. 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 ...

随机推荐

  1. python_为被装饰的函数保留元数据

    案例: 在函数对象中保存着一些函数的元数据,如: f.__name__           函数名 f.__doc__              函数文档 f.__moudle__       函数所 ...

  2. linkin大话面向对象--java关键字

    java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract  default  null  synchronized ...

  3. Hibernate (一)

    1 JDBC的优缺点 优点: 直接底层操作,提供了简单.便捷的访问数据库的方法,跨平台比较强. 灵活性比较强,可以写复杂的SQL. 缺点: JDBC没有做到面向对象的编程,使得程序员的思考还停留在SQ ...

  4. VisionPro学习笔记:用IEEE1394相机抓取图像

    1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...

  5. 安卓和IOS兼容问题

    点击穿透 click延迟 scroll元素临界的bug android screen.w/h 不准 rem不准 scroll时动画失效 animate回调 最小字号限制 不同机型全屏自适应 andro ...

  6. TOMCAT原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  7. 【转】globk和glorg中使用的apr文件

    gamit和globk分析设置先验坐标和速度的要求和规则是不同的,因为在不同的阶段和环境下需要不同.从相位数据和松弛约束坐标和它们的方差得到的精 密坐标的可靠估计是假设对先验值的调整很小,也就是说在调 ...

  8. pat 1014 1017 排队类问题

    1.用循环模拟时间 2.采用结构体模拟客户和窗口对象 3.合理处理边界,去除无用信息 4.使用自带排序sort()结合自定义功能函数compare()实现排序

  9. centos7+ansible自动化工具使用

    一.基础介绍 ========================================================================================== 1. ...

  10. python自动化运维常用模块安装

    1.系统信息性能模块:psutil 源码安装: wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz -- ...