每一个可以移动的棋子都要移动——Every-SG 游戏

先看一个问题

HDU 3595 GG and MM (Every_SG博弈)

题目有N个游戏同时进行,每个游戏有两堆石子,每次从个数多的堆中取走数量小的数量的整数倍的石子。取最后一次的获胜。并且N个游戏同时进行,除非游戏结束,否则必须操作。

现在问题变成了,每次都必须在每个非空石子堆中选择。

这个问题的核心在于:

对于我们可以赢的单一游戏,我们一定要拿到这一场游戏的胜利!

所以,我们只需要考虑如何让我们必胜的游戏尽可能长的玩下去。

但是对手却不希望他必败的单一游戏玩的太久,这就是 Every-SG 游 戏不同于其他 SG 游戏的地方:一般的 SG 游戏只有胜与负之间的博弈, 而 Every-SG 游戏又添加了长与短之间的博弈,这使得 Every-SG 游戏更 有嚼头,更有味道。 

最后的定理是显然的,最大的单一游戏步数如果是奇数的话那么肯定是先手取得进行最后一步。否则一定是对手取走最后一个棋子。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1010

int dp[N][N];

int dfs(int p,int q)
{
    if(p>q) swap(p,q);
    if(p==0)
    {
        dp[p][q] = 0;
        return 0;//必败
    }
    int k = q/p;
    int tp = q-p*k,tq = p;
    int flag = dfs(q-p*k,p);
    if(k==1)
    {
        dp[p][q] = dp[tp][tq]+1;
        return flag^1;
    }
    else
    {
        if(flag == 0)
        {
            dp[p][q] = dp[tp][tq]+1;
        }
        else dp[p][q] = dp[tp][tq]+2;
        return 1;
    }
}

int main() {
    int n;
    memset(dp,-1,sizeof(dp));
    while(cin>>n)
    {
        int mx = -1;
        for(int i=0;i<n;i++)
        {
            int p,q;
            cin>>p>>q;
            dfs(p,q);

            mx = max( mx,dp[min(p,q)][max(p,q)] );
        }
        if( (mx&1) ) printf("MM\n");
        else printf("GG\n");
    }
    return 0;
}

hdu3595

时间: 2024-10-16 17:40:45

每一个可以移动的棋子都要移动——Every-SG 游戏的相关文章

对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关心应用可同时处理的请求数,以及响应时间.应用本身和它运行在其中的web容器是两个很重要的影响因素.对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束.如果同时进来的请求多于当前可用的请求处理线程数,额外的线程就会被创建,直到到达配置的最大线程数(maxThreads

安卓声明一个全局变量,每个activity都可以调用和修改

当需要一个变量,每个activity都能够调用和修改的时候,可以先创建一个类,让他继承Application,并实现一些方法就行了,下面的例子:App打开,文本显示全局变量的初始值,点击按钮,文本值改变,并更新显示. 首先创建一个类:Myapplication.java package com.example.application; import android.app.Application; public class Myapplication extends Application {

哥德巴赫猜想: 任何一个大于2的偶数都可以拆分为两个素数的和

打印出小于2000的偶数拆分情况: var goldbach = function (n){ for(var i = 2;i<n; i++){ if(isPrime(i) && isPrime(n-i)){return {n1:i,n2:(n-i)} ;} } return undefined; } var isPrime = function (n){ for(var i = 2; i< n; i++){if(n%i == 0){return false;}} return

查看一个进程打开的文件都有哪些

step 1 pfile pid step 2 根据 inode number 查找 比如 bash-2.05# pfiles 26053 26053: python Current rlimit: 256 file descriptors 0: S_IFCHR mode:0620 dev:32,0 ino:3982 uid:0 gid:7 rdev:24,2 O_RDWR|O_NOCTTY|O_LARGEFILE 1: S_IFCHR mode:0620 dev:32,0 ino:3982 u

OneExerciseOne创建一个类,它包含一个int域,一个char域,他们都没有初始化,验证Java执行了默认初始化

在学习<Thinking In java>时,遇到Chapter 2的Exercise 1,问题是这么说的"/**创建一个类,它包含一个int域,一个char域,他们都没有初始化,将他们的值打印出来,验证Java执行了默认初始化".刚拿到这道题目我是这么写的. 1. package Two; public class ExerciseOne {public static void main(String [] args){int a;char c;System.out.pr

【一首小诗】每一个难捱的日子都是一首诗

不要勉强开心 微笑会撕裂伤口 悲伤同样需要流淌 给负能量一个安静的地方休息 什么也别说给他一个大大的拥抱 每一个难捱的日子都是一首诗 不华丽 不张扬 不影响明年夏天芒果的芳香 好像你还在身旁 -- 松柏 原文地址:https://www.cnblogs.com/share23/p/9819911.html

九成用户都在电视上玩游戏是种什么体验?

选择以游戏作为智能盒子乃至智能电视的突破点,国内厂商并非仅仅为了那看得见够不着的9成用户大蓝海.而是不搞游戏,智能盒子就是个卖硬件的. 本文为张书乐供IT时代网.IT时代周刊专稿,作者微信号:zsl13973399819 7月9日,红网记者做了一个<电视游戏,你玩过吗?>网络调查,截至7月9日16:00,共收到215个投票,仅1成网友表示偶尔会通过电视来玩游戏,PC和移动设备仍然是主流的游戏平台. 尽管样本量很小,但对于这个结果,笔者并不感到奇怪.撇开专业的视频游戏机不算,至少在安卓系统下的智

登记式单例实现单例模式的继承(限定一个抽象类的所有子类都必须是单例)

一直都在想如何在Java写一个抽象类,让该抽象类的所有子类都限定为单例模式,一个类需要设计成单例时直接继承该抽象类,而单例的限定与实例获取交给抽象类来完成.一个传统的单例类形如一下形式: 1 public class Singleton { 2 private static final Singleton singleton = new Singleton(); 3 4 //限制产生多个对象 5 private Singleton(){ 6 } 7 8 //通过该方法获得实例对象 9 publi

csuoj_1723-想打架吗?算我一个!所有人,都过来!

题目: Description 现在<炉石传说>这款卡牌游戏已经风靡全球.2015年加入环境的"黑石山的火焰"扩展带来了一个新套牌的核心卡片"恐怖的奴隶主",而这套统治游戏的套牌叫做"奴隶战"."恐怖的奴隶主"的登场音效"想打架吗?算我一个!"一定在所有这个时代的<炉石传说>玩家心里留下来难以磨灭的印象. "恐怖的奴隶主"是一个有3点生命值的生物,当其在场上受到非