GG and MM HDU - 3595 Every-SG
$ \color{#0066ff}{ 题目描述 }$
两堆石子,GG和MM轮流取,每次在一堆石子中取另一堆石子的k\((k\ge1)\)倍,不能操作的输
现在二人要玩n个这样的游戏,每回合每个人对每个未完成的游戏进行操作,胜负取决于最后一个游戏的结果
问能否先手必胜
\(\color{#0066ff}{输入格式}\)
多组数据
第一行一个n
接下来n行为每个游戏的两堆石子
\(\color{#0066ff}{输出格式}\)
每组数据输出谁能赢(MM先手)
\(\color{#0066ff}{输入样例}\)
3
1 1
1 1
1 1
1
3 2
\(\color{#0066ff}{输出样例}\)
MM
GG
\(\color{#0066ff}{数据范围与提示}\)
数据组数\(\le 100\)
n和每堆石子数都\(\le 1000\)
\(\color{#0066ff}{题解}\)
看到对已存在的游戏都要操作,那就是EverySG了
与普通SG不同的是,多了时间这一维
记录一个step,与sg同维
最后step大的必胜
step的转移
如果当前是必胜态,那么从所有必败态的step取max+1转移过来
如果当前是必败态,那么从所有必胜态的step取min+1转移过来
#include <cctype>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int inf = 0x7fffffff;
const int maxn = 1050;
int sg[maxn][maxn];
int step[maxn][maxn];
bool vis[maxn * maxn];
int work(int x, int y) {
if(x > y) std::swap(x, y);
if(!x || !y) return sg[x][y] = step[x][y] = 0;
if(~sg[x][y]) return sg[x][y];
int max = 0, min = inf;
for(int k = 1; k * x <= y; k++) work(x, y - x * k);
for(int k = 1; k * x <= y; k++) {
int xx = x, yy = y - x * k;
if(xx > yy) std::swap(xx, yy);
vis[sg[xx][yy]] = true;
if(sg[xx][yy]) min = std::min(min, step[xx][yy]);
if(!sg[xx][yy]) max = std::max(max, step[xx][yy]);
}
for(sg[x][y] = 0; vis[sg[x][y]]; sg[x][y]++);
if(sg[x][y]) step[x][y] = max + 1;
else step[x][y] = min + 1;
for(int k = 1; k * x <= y; k++) {
int xx = x, yy = y - x * k;
if(xx > yy) std::swap(xx, yy);
vis[sg[xx][yy]] = false;
}
return sg[x][y];
}
int main() {
int n;
memset(sg, -1, sizeof sg);
while(~scanf("%d", &n)) {
int x, y, GG = 0, MM = 0;
for(int i = 1; i <= n; i++) {
x = in(), y = in();
if(x > y) std::swap(x, y);
work(x, y);
if(sg[x][y]) MM = std::max(MM, step[x][y]);
else GG = std::max(GG, step[x][y]);
}
puts(MM < GG? "GG" : "MM");
}
return 0;
}
GG and MM HDU - 3595 Every-SG的更多相关文章
- HDU 3595 every-sg模型
多个子游戏同时进行,每个子游戏给出两个数a,b,可以将大的数减去k倍小的数,不能操作者输. 策略就是对于一个必胜的游戏要使得步数更长,对于一个必败的游戏使得步数最短. 以下都来自贾志豪的论文.. 对于 ...
- 【HDU3595】GG and MM(博弈论)
[HDU3595]GG and MM(博弈论) 题面 HDU 一个游戏由多个游戏组成,每次每个操作者必须操作所有可以操作的游戏,操作集合为空者输. 每个游戏由两堆石子组成,每次可以从较多的那一堆中取走 ...
- Java网络编程-你是GG还是MM?
第六阶段 网络编程 每一台计算机通过网络连接起来,达到了数据互动的效果,而网络编程所解决的问题就是如何让程序与程序之间实现数据的通讯与互动 在吗?你是GG还是MM? (一) 网络模型概述 (1) 两大 ...
- S-Nim HDU 1536 博弈 sg函数
S-Nim HDU 1536 博弈 sg函数 题意 首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之 ...
- hdu 3595 GG and MM 博弈论
同时进行,必须操作这就是Every-SG的特点 同样在贾志豪的论文中有提到这种游戏:组合游戏略述——浅谈SG游戏的若干拓展及变形 其中这个游戏特点不仅有必胜和必败,而且有时间长短的博弈,对于自己必胜的 ...
- HDU 3595 GG and MM [Every-SG]
传送门 题意: 两个数$x,y$,一个人的决策为让大数减去小数的任意倍数(结果不能为负),出现0的人胜 一堆这样的游戏同时玩 Every-SG 游戏规定,对于还没有结束的单一游戏,游戏者必须对该游戏进 ...
- hdu 1404 找sg ***
HDU 1404 Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...
- hdu 1848 简单SG函数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...
- HDU 4678 Mine SG博弈
http://acm.hdu.edu.cn/showproblem.php?pid=4678 自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG 这里子游戏之间没有影响 ...
随机推荐
- struct 方法使用
struct _Worker { _Worker() { pWokerbase=NULL; hThread=INVALID_HANDLE_VALUE; pListConn=NULL; } struct ...
- oracle更改编码
背景:win764bit英文操作系统(支持中文) oracle11G默认安装 从ZHS16GBK字符集导入数据库 表现:plsql显示为乱码,所有汉字显示为“靠” 解决:1.查看并更改数据库的编码为Z ...
- 【284】◀▶ arcpy.da & arcpy 数据访问模块
使用游标访问数据 数据访问模块 (arcpy.da) 参考: ArcGIS Python编程案例(9)-ArcPy数据访问模块 读取几何 写入几何 使用 Python 指定查询 01 da.Sea ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2887 Solved: 954[Submit ...
- libevent源码深度剖析十二
libevent源码深度剖析十二 ——让libevent支持多线程 张亮 Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libev ...
- libevent源码深度剖析二
libevent源码深度剖析二 ——Reactor模式 张亮 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个 ...
- java实现微信H5支付
前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自 ...
- 面试题:SpringMVC的工作流程
SpringMVC是当今最主流的Web MVC框架,没有之一,要做一名合格的JavaWeb工程师,学好它势在必行! 与Struts2原理不同,SpringMVC是通过最基础最传统的servlet来实现 ...
- 面试题:filter过滤器 listener 监听器 案例有点用
1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...
- Spring下面的@Transactional注解标志的讲解
最近在开发中对Spring中的事务标记@Transactional用的比较多,今天上网收集了一些内容,做一个简单的总结~~~ 在service类前加上@Transactional,声明这个servic ...