$ \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的更多相关文章

  1. HDU 3595 every-sg模型

    多个子游戏同时进行,每个子游戏给出两个数a,b,可以将大的数减去k倍小的数,不能操作者输. 策略就是对于一个必胜的游戏要使得步数更长,对于一个必败的游戏使得步数最短. 以下都来自贾志豪的论文.. 对于 ...

  2. 【HDU3595】GG and MM(博弈论)

    [HDU3595]GG and MM(博弈论) 题面 HDU 一个游戏由多个游戏组成,每次每个操作者必须操作所有可以操作的游戏,操作集合为空者输. 每个游戏由两堆石子组成,每次可以从较多的那一堆中取走 ...

  3. Java网络编程-你是GG还是MM?

    第六阶段 网络编程 每一台计算机通过网络连接起来,达到了数据互动的效果,而网络编程所解决的问题就是如何让程序与程序之间实现数据的通讯与互动 在吗?你是GG还是MM? (一) 网络模型概述 (1) 两大 ...

  4. S-Nim HDU 1536 博弈 sg函数

    S-Nim HDU 1536 博弈 sg函数 题意 首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之 ...

  5. hdu 3595 GG and MM 博弈论

    同时进行,必须操作这就是Every-SG的特点 同样在贾志豪的论文中有提到这种游戏:组合游戏略述——浅谈SG游戏的若干拓展及变形 其中这个游戏特点不仅有必胜和必败,而且有时间长短的博弈,对于自己必胜的 ...

  6. HDU 3595 GG and MM [Every-SG]

    传送门 题意: 两个数$x,y$,一个人的决策为让大数减去小数的任意倍数(结果不能为负),出现0的人胜 一堆这样的游戏同时玩 Every-SG 游戏规定,对于还没有结束的单一游戏,游戏者必须对该游戏进 ...

  7. hdu 1404 找sg ***

    HDU 1404  Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...

  8. hdu 1848 简单SG函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...

  9. HDU 4678 Mine SG博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=4678 自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG 这里子游戏之间没有影响 ...

随机推荐

  1. 真是服了:.EndEdit(); 如果没哟这个一句(c#更新ACCESS,datagridview无法更新第一行)

    //保存 this.jbbBindingSource3.EndEdit(); this.jbbTableAdapter3.Update(this.databaseDataSet3.jbb);

  2. Listview使用安卓自带布局实现单选

    安卓提供了一些自带的布局,使用非常简单.直接看代码吧. package com.example.linfeng.myapplication; import android.app.Activity; ...

  3. winform 如何正确的获取窗体的标题栏高度

    最近我需要知道鼠标在一个控件里的相对位置,鼠标相对于屏幕的位置我是可以知道的,所以只要得到控件相对于屏幕的位置,就可以算出鼠标相对于控件的位置了 但是发现有误差 后来经过测试是由于窗体的标题栏高度导致 ...

  4. Spring Cloud Config 1 (分布式配置中心)

    spring cloud config是spring cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端和客户端两部分. 服务端也被称为 ...

  5. Apache与Tomcat联系及区别

    Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. A ...

  6. Python和其他语言的区别 (简单精辟啊 手打)

    首先是简单 读和写非常容易 免费 免费且开源 社区为专业人士和初学者提供知识和经验的分享交流平台 兼容性 与多平台兼容 面向对象 支持面向对象编程 php面向网络 函数库 python 社区创建了丰富 ...

  7. day58-activiti 13-搭建web项目环境

    Eclipse的项目的build目录不可被删除,删除了也会被自动创建. 到项目的输出路径才看得到编译好的Java类.Eclipse的视图下是看不见的,因为类路径下的这个目录build不想让你操作,它给 ...

  8. php连接redis

    $redis = new Redis(); $redis->connect();

  9. ubuntu扩展屏幕

    1.了解设置的名称 直接运行xrandr(不带任何参数)就可以显示出当前的显示设备及设备的模式. xdj@xdj-Presario-CQ42-Notebook-PC:~$ xrandr Screen ...

  10. 单元测试NUnit 的文章

    请参考 https://www.cnblogs.com/ranh941/p/7629279.htmlhttps://blog.csdn.net/qincode/article/details/1831 ...