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;
}

如有不当之处欢迎指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面中可以对界面中显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面中查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值