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 这里子游戏之间没有影响 ...
随机推荐
- telnet测试端口是否正常打开
点击计算机的开始菜单-->运行 ,输入CMD命令,然后确定.打开cmd命令行. 输入telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口 回车 如果端口关 ...
- 判断手机使用网络wifi 2G 3G
ConnectivityManager cManager = (ConnectivityManager) this .getSystemService(Context.CONNECTIVITY_SER ...
- validate 不校验的解决办法
最近使用validate.js用于项目的表单校验,调了半天,怎么都不校验,仔细对照例子发现 例子中要校验的文本框除了ID外还有name属性,而我在做的时候没有name属性,到这里终于 看到了希望,把所 ...
- 13-STL-二分查找
STL中提供-二分查找算法(binary_search lower_bound upper_bound equal_range STL包含四种不同的二分查找算法,binary_search ...
- Web网站的几个QPS
评价一个网站的"大小",处于视角的不同,有很多种衡量的方法,类似文章数,页面数之类的数据非常明显,也没有什么可以争议的.但对于并发来说,争议非常之多,这里就从一个技术的角度开始,谈 ...
- js加载页面使用execute_script选定加载位置
#由于js逐步加载页面,存在未显示的网页无法加载源码 from selenium import webdriver driver = webdriver.Firefox() init_element ...
- TreeView的绑定与读取
/// <summary> /// 绑定TreeView /// </summary> public void BindTreeVie ...
- iPhone的home键进果汁了,按起来粘粘的感觉
解决办法是按住home键转动一下,再用棉签蘸点水或者酒精都行(注意:水不要太多,不能让水渗进去),用棉签按压home 键多转几圈就好了.
- JAVA的编码转换测试
package test; import java.io.UnsupportedEncodingException; /** * * @author jim */ public class Test ...
- 编写高质量代码改善C#程序的157个建议——建议10: 创建对象时需要考虑是否实现比较器
建议10: 创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,在.NET的世界中也一样.举个最简单的例子,在UI中,有一个10个人的Salary列表.根据排序的需要,列表要支持针对基本工资来 ...