[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60481118

由于今天考了一道博弈的问题,我竟什么都不会!于是把之前大佬的讲稿翻出来从头学起

博弈论的基础嘛,就先不提什么SG函数了。简单的讲讲如何判断先手必胜还是必败吧。

每一个状态会有多个后继状态(即走了一步之后的状态),每一个状态都有一个属性:先手必胜 或 先手必败(先手是相对于这一状态)。

如果一个状态的后继状态中有必败态,那么当前状态的先手就可以选择那个必败的后继状态,这样下一次的先手(当前的后手)就完了。

如果一个状态的后继状态中没有必败,只有必胜态,此时不论先手选择哪一个后继状态,他都输了。

判断先手必胜还是必败,其过程类似于递归。边界就是题目中的游戏结束条件,边界的状态必定是必败态。

我们可以发现,先手的优势在于可以对局势作出调整,使其向自己希望的方向发展。当没有选择的余地时,就是听天由命了。

下面放题:

Problem Description

Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then Ollie, the second player, does the same with the two resulting numbers, then Stan, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with (25,7):

25 7

11 7

4 7

4 3

1 3

1 0

an Stan wins.

Input

The input consists of a number of lines. Each line contains two positive integers giving the starting two numbers of the game. Stan always starts.

Output

For each line of input, output one line saying either Stan wins or Ollie wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.

Sample Input

34 12

15 24

0 0

Sample Output

Stan wins

Ollie wins

Recommend

LL

题目大意

给定两个数a和b,两个人轮流操作,每个人每次可以让较大数减去较小数的整次倍。

若有一个数为0,则无法操作,无法操作者输,求先手必胜还是后手必胜。

我们发现,无论怎么做,a,b都会最终变为a%b,b的状态(假设a>=b)。当a-b>=b时,先手就有选择的余地:一次取完或只取一部分。只要有选择的余地,先手就必胜,因为他可以调整游戏回合次数。

对于这道题,每个状态可以看做只有一个后继状态,即a%b,b,从后继状态转移过来。如果a-b>=b,就把当前的转为必胜态。

还是很形象的

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; bool dfs(int a,int b){
if(b==0) return 0;
bool rt=dfs(b,a%b);
rt^=1;
if(a>=2*b) rt=1;
return rt;
}
int main(){
int a,b;
while(scanf("%d%d",&a,&b)){
if(a==0&&b==0) break;
if(a<b) swap(a,b);
if(dfs(a,b)) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}

基础博弈论之——简单的博弈问题【hdu1525】【Euclid‘s Game】的更多相关文章

  1. JS基础(超级简单)

    1     JS基础(超级简单) 1.1 数据类型 1.1.1   基本类型: 1)        Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2)       ...

  2. JMeter基础之一 一个简单的性能测试

    JMeter基础之一 一个简单的性能测试 上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测 ...

  3. ArcGIS Pro 简明教程(2)基础操作和简单制图

    ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...

  4. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址

    Android BLE与终端通信(一)--Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址 Hello,工作需要,也必须开始向BLE方向学习了,公司的核心技术就是BLE终端 ...

  5. [Songqw.Net 基础]WPF实现简单的插件化开发

    原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...

  6. 最简单的博弈论——HDU - 5963 朋友 (博弈)

    OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...

  7. hdu1525 Euclid&#39;s Game , 基础博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 两人博弈,给出两个数a和b, 较大数减去较小数的随意倍数.结果不能小于0,将两个数随意一个数减到0 ...

  8. 博弈论中的Nim博弈

    瞎扯 \(orzorz\) \(cdx\) 聚聚给我们讲了博弈论.我要没学上了,祝各位新年快乐.现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了. 马上就要回去上文化课了,今明还是收下尾 ...

  9. 博弈论最简单例子TacTicToe

    博弈论是人工智能中的一个分支.顾名思义就是下棋的算法.当然引申出来的应用可能不止用来下棋,也可以用来做游戏或者模拟战争策略等. 博弈的基本算法也是模拟人的思维,比如当自己下子时遍历所有可能寻求最有利步 ...

随机推荐

  1. php 链接转二维码图片

    // 类库下载地址 https://sourceforge.net/projects/phpqrcode/files/ $value = 'www.baidu.com';//二维码内容 $errorC ...

  2. HDU 4681 String 胡搞

    设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA. 设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB. 求出每一 ...

  3. 团队项目-第七次scrum 会议

    时间:11.3 时长:30分钟 地点:F楼1039教室 工作情况 团队成员 已完成任务 待完成任务 解小锐 学习cocos creator样例 修复员工招聘时bug 陈鑫 完成fire()与UI的对接 ...

  4. hdu1712 分组背包 ACboy needs your help

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. jQuery选择器示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. sqlalchemy presto 时间比较

    大数据统计时,需要计算开仓订单减掉经纪商时间差,等于n 小时 或 星期几的订单. presto sql语句如下: select sum(profit) from t_table where open_ ...

  7. mogodb gui

    mogodb gui https://robomongo.org/ https://github.com/Studio3T/robomongo https://www.imooc.com/learn/ ...

  8. vue cli & npm err & shit cnpm

    vue cli & npm err & shit cnpm npm err & shit cnpm https://github.com/vuejs/vue-cli/issue ...

  9. 【bzoj2079】[Poi2010]Guilds 构造结论题

    题目描述 Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市 ...

  10. [codeforces] 526D [51nod] 1554 欧姆诺姆和项链

    原题 KMP 方法一: 听说是ex-kmp--来自学姐 ex-kmp是处理两个串s和t之间,t的每一个后缀在s中的最长前缀的长度的一个算法. 它很像manacher(至少我和学姐这么认为),记录了一个 ...