poj1067-取石子游戏 (威佐夫博弈)
http://poj.org/problem?id=1067
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36753 | Accepted: 12446 |
Description
Input
Output
Sample Input
2 1
8 4
4 7
Sample Output
0
1
0
题解:这是威佐夫博弈。所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的:
有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:
1、在一堆石子中取走任意多颗;
2、在两堆石子中取走相同多的任意颗;
约定取走最后一颗石子的人为赢家,求必胜策略。
两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态。状态有必败态、必胜态和可能胜利态。比如:(0,0)肯定是必败态。(0,k),(k,0),(k,k)系列的节点肯定是必胜态。经分析推敲,我们可以知道必败态有:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)等。对于必败态(ak,bk),我们有:ak =[k*(1+√5)/2],bk= ak + k (k=0,1,2,...n ,其中方括号表示取整函数) 。对于必败态,先拿者输;对于非必败态,先拿者赢。至于数学证明,参考一位博友的文章吧:http://blog.sina.com.cn/s/blog_727d57100100ql6e.html
代码:
#include <fstream>
#include <iostream>
#include <cstdio>
#include <cmath> using namespace std; int main()
{
//freopen("D:\\input.in","r",stdin);
//freopen("D:\\output.out","w",stdout);
int a,b;
double m=(sqrt(5.0)+)/;
while(~scanf("%d%d",&a,&b)){
if(a<b){
a^=b;
b^=a;
a^=b;
}
int k=a-b;
if(b==(int)(k*m))
puts("");
else
puts("");
}
return ;
}
poj1067-取石子游戏 (威佐夫博弈)的更多相关文章
- POJ1067 取石子游戏 威佐夫博弈 博弈论
http://poj.org/problem?id=1067 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可 ...
- 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= ...
- HDU2177:取(2堆)石子游戏(威佐夫博弈)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
随机推荐
- 记一笔vue中的中央事件总线的问题,以及解决方案
代码结构:首先HeaderNav组件是被单独拎出来的,router-view中就对应了内容组件,由于有时候i有的界面的header内容是不一样的,因此要用到兄弟组件的相互通信,这个时候我首先选择了bu ...
- cowboy页面重定向的例子
创建工程 rebar-creator create-app testCowboy testCowboy_app.erl -module(testCowboy_app). -behaviour(appl ...
- dts、dtb编译
设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...
- Java将对象写入文件读出——序列化与反序列化
Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的. 写入: File aFile=new File("e:\\c.txt&q ...
- 一个for循环写出9*9乘法表
public class ClassTest03 { public static void main(String[] args) { for(int i=1,j=1;j<=9;j++){ if ...
- node+express+socket.io制作一个聊天室功能
首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...
- linux oracle服务器无密码登录dba
1.su - oracle 切换到oracle 2.sqlplus sys/manger as sysdba 3.新建用户: create user username identified by pa ...
- 【UVA】673 Parentheses Balance(栈处理表达式)
题目 题目 分析 写了个平淡无奇的栈处理表达式,在WA了5发后发现,我没处理空串,,,,(或者说鲁棒性差? 代码 #include <bits/stdc++.h> usin ...
- 查看Android内存,cpu
转自https://testerhome.com/topics/2583 一.查看内存 查看Android应用内存: adb shell dumpsys meminfo 1.查看详细的内存: adb ...
- Mongo db change datadir
To change the location used by MongoDB to store its data, you need to: Edit /etc/mongodb.conf and ch ...