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 这里子游戏之间没有影响 ...
随机推荐
- 项目代码:js
1 //获取发文时间 function selectWriteTime(){ $("#writing_time_index").on("click"," ...
- 599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
[抄题]: Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of fa ...
- CSS文本溢出处理
1.超出层的高度和宽度时文本自动隐藏 overflow:hidden;text-overflow:ellipsis; 2.超出层的宽度时隐藏溢出的文本以...表示,Firefox不兼容,只隐藏溢出的文 ...
- Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
好像是某CF的题,不记得…… 很套路的题,但是觉得可以做一下笔记. 倍增 + 差分. 有一个比较简单的思路就是每一个点$x$向上走一走,直到走到一个点$y$使总路程恰好不超过超过了$L$,然后把$(x ...
- SVN下载地址及注意事项
SVN下载地址:VisualSVN:http://www.visualsvn.com/server/download 服务器端(添加仓库和用户)TortoiseSVN:http://torto ...
- HDU 3729 I'm Telling the Truth (二分匹配)
题意:给定 n 个人成绩排名区间,然后问你最多有多少人成绩是真实的. 析:真是没想到二分匹配,....后来看到,一下子就明白了,原来是水题,二分匹配,只要把每个人和他对应的区间连起来就好,跑一次二分匹 ...
- [转]xe6 android 使用距离传感器(Proximiry)
The first step it's a run sample from RAD Studio that named SensorInfo on your device. On the tab Bi ...
- DELPHI 调用系统 ADO 配置窗体 提高软件易用性
最近DELPHI好像不太景气哦,把自己的代码拿出来晒晒.高手别喷哦. 直接上代码 implementation uses AdoConEd; var saveconnstr:string; proc ...
- Android Hander、Looper、Message三者之间的联系
1.首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象:因为Looper.prepare()在一个线程中只能调用一次,所以Mess ...
- delphi json用法
用法:uses Superobject, Sperjsondelphi里有json单元. procedure TForm2.SuperObjectClick(Sender: TObject); var ...