POJ 2348 Euclid's Game 博弈论
http://poj.org/problem?id=2348
顺便说,必应翻译真的好用,比谷歌翻译好用100倍。
很难判断这道题的具体博弈类型。
有两种写法,一种是找规律,一种是推理得到关系后循环(或递归)处理。两种写法都能在题目下面的discuss中找到。
1.找规律,我在这里直接复制了discuss中大神算出的sg函数表(在考试中这种写法是很值得借鉴的,这里就体现出代码能力的重要了,找规律天下第一!)。
我算了一下前 30 × 30 的 Sprague-Grundy 函数表,如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
-----------------------------------------------------------------------------------------------
0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
2 | 0 2 1 0 2 1 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15
3 | 0 3 0 1 0 1 2 1 2 3 2 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10
4 | 0 4 2 0 1 0 0 1 2 1 1 2 3 2 3 3 4 3 4 4 5 5 5 5 6 6 6 6 7 7 7
5 | 0 5 1 1 0 1 0 0 0 1 2 1 2 2 2 3 2 3 3 3 4 3 4 4 4 5 4 5 5 5 6
6 | 0 6 3 2 0 0 1 0 0 0 1 1 2 1 1 1 2 2 3 2 2 3 3 3 4 3 4 4 4 4 5
7 | 0 7 3 1 1 0 0 1 0 0 0 0 1 1 2 1 1 2 2 2 2 3 2 2 3 3 3 3 4 3 4
8 | 0 8 4 2 2 0 0 0 1 0 0 0 0 1 1 1 2 1 1 1 1 2 2 2 3 2 2 3 3 3 3
9 | 0 9 4 3 1 1 0 0 0 1 0 0 0 0 0 1 1 1 2 1 1 1 2 2 2 2 2 3 2 2 2
10 | 0 10 5 2 1 2 1 0 0 0 1 0 0 0 0 0 0 1 1 1 2 1 1 1 2 1 2 2 2 2 3
11 | 0 11 5 3 2 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 2 1 1 1 1 2 2 2 2
12 | 0 12 6 4 3 2 2 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 2 1 1 1 1 1 1
13 | 0 13 6 4 2 2 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 2 1 1 1 1
14 | 0 14 7 4 3 2 1 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 2 1 1
15 | 0 15 7 5 3 3 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2
16 | 0 16 8 5 4 2 2 1 2 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1
17 | 0 17 8 5 3 3 2 2 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1
18 | 0 18 9 6 4 3 3 2 1 2 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
19 | 0 19 9 6 4 3 2 2 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
20 | 0 20 10 6 5 4 2 2 1 1 2 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
21 | 0 21 10 7 5 3 3 3 2 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
22 | 0 22 11 7 5 4 3 2 2 2 1 2 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
23 | 0 23 11 7 5 4 3 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
24 | 0 24 12 8 6 4 4 3 3 2 2 1 2 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
25 | 0 25 12 8 6 5 3 3 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
26 | 0 26 13 8 6 4 4 3 2 2 2 1 1 2 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
27 | 0 27 13 9 6 5 4 3 3 3 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
28 | 0 28 14 9 7 5 4 4 3 2 2 2 1 1 2 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
29 | 0 29 14 9 7 5 4 3 3 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0
30 | 0 30 15 10 7 6 5 4 3 2 3 2 1 1 1 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1
可以发现0的分界线在黄金分割比附近,直接算一个边界就可以了。边界不好看清的话可以上下拖动滚动条。(我大概有病orz,不过真的能看见,希望大家试试)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<ctime>
using namespace std;
const int maxn=<<;
int n;
int main(){
long long x,y;
while(~scanf("%lld%lld",&x,&y)){
if(x==&&y==)break;
if(x>y)swap(x,y);
long long w=((double)x*2.0/(sqrt(5.0)-1.0));
if(y<=w&&y!=x)printf("Ollie wins\n");
else printf("Stan wins\n");
}
return ;
}
1.根据规则进行推理,在日常写题还是很推荐这种写法的,毕竟博弈论能找到规律的毕竟只是一部分,大部分不用dp的博弈论都是相应对策或者必胜选择的推理(个人感受不一定对)。
记每次一个人开始操作前的两数大的为y,小的x。
全程两人都没有选择(每次的情况都满足y减去一次x就比x小)的时候结果是一定的,那么直接循环找出最终胜利者就可以了(显然满足这种条件的时候循环次数不会太多)。
假如其中有一个人有选择(y可以减n次小的才比x小,n>1)的时候,这个人如果在y中取n个x时必输,这个人就可以在y中取n-1个x,那么对方就必输。
于是有了一个循环解决的写法。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<ctime>
using namespace std;
const int maxn=<<;
int n;
int main(){
long long x,y;
while(~scanf("%lld%lld",&x,&y)){
if(x==&&y==)break;
if(x>y)swap(x,y);
int w=;
while(x!=){
if(y%x==||y-x>x)break;
y-=x;
w^=;
if(x>y)swap(x,y);
}
if(w)printf("Ollie wins\n");
else printf("Stan wins\n");
}
return ;
}
POJ 2348 Euclid's Game 博弈论的更多相关文章
- poj 2348 Euclid's Game 题解
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9023 Accepted: 3691 Des ...
- POJ 2348 Euclid's Game(博弈论)
[题目链接] http://poj.org/problem?id=2348 [题目大意] 给出两个数,两个参赛者轮流用一个数减去另一个数的倍数,当一个数为0的时候游戏获胜, 求先手是否必胜 [题解] ...
- POJ 2348 Euclid's Game(辗转相除博弈+自由度分析)
题目链接:http://poj.org/problem?id=2348 题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其 ...
- POJ 2348 Euclid's Game【博弈】
题目链接: http://poj.org/problem?id=2348 题意: 给定两个数,两个人每次从较大数中减去较小数的倍数,谁先得到0谁获胜,为谁赢? 分析: 令一种可能出现的整数对为(a,b ...
- POJ 2348 Euclid's Game(博弈)题解
题意:有a,b两个数字,两人轮流操作,每次可以选择两个之中较小的数字,然后另一个数字减去选择数字的任意倍数(不能减到负数),直到其中一个为0,不能操作为败 思路:这题用博弈NP思想,必败点和必胜点之间 ...
- POJ 2348 Euclid Game (模拟题)
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7942 Accepted: 3227 Des ...
- POJ 2348 Euclid's Game(简单博弈)
这道题没说a b最大多少,所以要声明为long long型,不然会WA! 道理很简单,(默认a>=b)a和b只有以下三种关系: 1.a%b==0 :这种关系下,可能是a/b为整数,也可能是a和b ...
- poj 2348 Euclid's Game
题目: 给两个整数a和b,两个人先后用较大的数减去较小数的整数倍,并且保证相减后为非负数.先把一个数变为0的人获胜. 分析: 很显然,当大数是小数的整数倍时为必胜态. 从这道题学会一个叫做自由度的东西 ...
- POJ 2348 Euclid's Game (博弈)
题意:给定两个整数,两个人轮流操作,每次可以用较大数减去较小数的整数倍,当一个数变成0时,则结束,问谁会胜. 析:很明显如果 a == b 那么就可以直接结束了,那么如果 a > b我们可以交换 ...
随机推荐
- 【BZOJ】1552/3506 [Cerc2007]robotic sort
[算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...
- B. Complete the Word(Codeforces Round #372 (Div. 2)) 尺取大法
B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- centos6.5下安装svn并且实现多项目管理配置方案
#安装SVN服务器 yum install subversion #在home下创建svn根目录 mkdir /home/svn #在 /home/svn下创建pro1 , pro2, pro3 三个 ...
- hdu 1272 小希的迷宫(并查集+最小生成树+队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- 运维开发:python websocket网页实时显示远程服务器日志信息
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...
- Linux 入门记录:三、Linux 文件基本操作管理
一.复制文件.目录 使用 cp 命令复制文件或目录: $ cp 源文件(夹)目标文件(夹) 常用参数: -r 递归复制整个目录树 -v 显示复制过程的详细信息 二.移动.重命名文件或目录 通过 mv ...
- python 学记笔记 SQLalchemy
数据库表是一个二维表,包含多行多列.把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表 ...
- Python中使用dom模块生成XML文件示例
在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...
- Hibernate检索策略与检索方式
hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...
- shell 中的<,<<,>,>>
相信熟悉linux的童鞋不会对这四个符合陌生,shell脚本的文件流有时候真的挺容易搞晕人的,下面我们一起了解一下吧 参考链接:http://www.cnblogs.com/chengmo/archi ...