SG定理:

根据Sprague-Grundy定理(SG定理),对于某些博弈论问题可以这样思考:

首先可以确定一个必败状态(记为P)或必胜状态(记为N);

这样一来,若某一状态X若 可以 直接转移到P,则可以确定X为必胜状态;

若某一状态X 只能 转移到N,则可以确定X为必败状态。

以此通过递推可确定先手必胜或必败。

题一:hdu1404

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int maxn = 1e7+6;
bool sg[maxn]; int intlen(int x)
{
for (int i=6;i>0;i--)
{
int k=pow(10,(i-1));
if (x / k) return i;
}
} void GetSG(int x)
{
//cout<<x<<endl;
int len=intlen(x);
for(int i=0; i<len; ++i)
{
int k=pow(10, i);
int q=x/k%10;
int y=x;
for(int j=q; j<9; ++j)
{
y+=k;
sg[y]=true;//可一步到达必败状态则为必胜
}
}
int y=x, k=1;
while(len<6)
{
y*=10;
for(int i=0; i<k; ++i)
sg[y+i]=true;
k*=10;
len++;
}
} int main()
{
memset(sg, false, sizeof(sg));
sg[0]=true;
for(int i=1; i<1000000; ++i)
if(!sg[i])//必败则进入
GetSG(i);
char n[10];
while(gets(n))
{
if(n[0]=='0')
{
puts("Yes");
continue;
}
int m=atoi(n);
if(sg[m]) puts("Yes");
else puts("No");
}
return 0;
}

题二:hdu1404

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; int main()
{
long long n;
while(cin>>n)
{
int x=0;
for(; n>1; ++x)
{
if(x&1)
n = ceil(n*1.0/2);
else
n = ceil(n*1.0/9);
}
if(x&1) puts("Stan wins.");
else puts("Ollie wins.");
}
return 0;
}

hdu1404,hdu1517 (博弈论入门)的更多相关文章

  1. 博弈论入门之nim游戏

    更好的阅读体验点这里 nim游戏 nim游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\)堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿),没法拿的人失败.问谁会胜利 ni ...

  2. 洛谷P3150 pb的游戏(1)题解 博弈论入门

    题目链接:https://www.luogu.org/problem/P3150 这道题目是博弈论的入门题. 我们以 必胜态 和 必败态 来讲解这个问题. 首先,下面的图片演示了前8个数的必胜态和必败 ...

  3. 博弈论入门——Nim游戏引入

    说实话,我真的对这个游戏看得是一脸懵逼,因为(我太弱了)我没有明白一些变量的意思,所以一直很懵,现在才明白,这让我明白博弈论(还可以骗钱)博大精深; 以下是我自己思考的过程,也许不严谨,但是最终明白了 ...

  4. 博弈论入门小结 分类: ACM TYPE 2014-08-31 10:15 73人阅读 评论(0) 收藏

    文章原地址:http://blog.csdn.net/zhangxiang0125/article/details/6174639 博弈论:是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策 ...

  5. [您有新的未分配科技点]博弈论入门:被博弈论支配的恐惧(Nim游戏,SG函数)

    今天初步学习了一下博弈论……感觉真的是好精妙啊……希望这篇博客可以帮助到和我一样刚学习博弈论的同学们. 博弈论,又被称为对策论,被用于考虑游戏中个体的预测行为和实际行为,并研究他们的应用策略.(其实这 ...

  6. 随手练——博弈论入门 leetcode - 486. Predict the Winner

    题目链接:https://leetcode.com/problems/predict-the-winner/ 1.暴力递归 当前数组左边界:i,右边界:j: 对于先发者来说,他能取到的最大值是:max ...

  7. 博弈论入门 Bash 、Nim 、Wythoff's Game结论及c++代码实现

    SG函数先不说,给自己总结下三大博弈.和二进制及黄金分割联系密切,数学真奇妙,如果不用考试就更好了. 1.Bash Game:n个物品,最少取1个,最多取m个,先取完者胜. 给对手留下(m+1)的倍数 ...

  8. 博弈论入门题 kiki's game

    Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his mind ...

  9. 洛谷P1488 肥猫的游戏 题解 博弈论入门

    题目链接:https://www.luogu.org/problem/P1488 其实这道题目我只需要 \(n\) 以及黑色三角形的三个端点编号就可以了. 我们假设在一个 \(n\) 边形中,黑色三角 ...

随机推荐

  1. display值的分类

    整体来讲,display的值可以分为6个大类,1个全局类,一共是7大类: 外部值 内部值 列表值 属性值 显示值 混合值 全局值 外部值,指的是这些值只会直接影响一个元素的外部表现,而不影响元素里面的 ...

  2. docker部署Broketrmq集群

    部署Broketrmq集群 通过docker-compose形式部署 首先创建 broker 配置文件,配置文件如下: brokerClusterName = DefaultCluster #集群名 ...

  3. 处理IOS浏览器在input或者textarea获取焦点后底部留一块灰色空白区域的bug

    document.body.addEventListener('focusout',function() { window.scrollTo(0,0) },false);

  4. 使用vue-cli(vue脚手架)快速搭建项目-2

    接上一篇文章,这篇文章对如何使用IDEA打开并运行项目做教程 1.将在窗口模式启动的Vue关闭 只需要按住Ctrl+C,输入Y就可以了 2.打开idea 3.复制你项目所在地址,然后点击OK 4.下面 ...

  5. GO练习题

    package main import( "fmt" ) func list(n int) { for i := 0; i <= n; i++ { fmt.Printf(&q ...

  6. Flutter学习五之网络请求和轮播图的实现

    上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...

  7. 实现图片的上传(要求:上传到指定的FTP服务器)

    考核的知识点: (1)Linux系统的使用 (2)tengine 纯HTTP的web服务器 (3)SpringMVC的上传功能 (4)FTP的数据传到 1.1        传统上传方式的问题 但是在 ...

  8. linux循环定时任务

    crond定时任务 centos # 重启服务 service crond restart ----------------------------------------- chkconfig cr ...

  9. MySQL 8.0索引合并

    简介 参考https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html#index-merge-intersection. ...

  10. Python-随机模块-random

    random 生成随机变量 生成 [0, 1) 随机数 .random import random random_number = random.random() print(random_numbe ...