• vijos 1655 萌萌的糖果博弈 博弈


    背景

    用糖果来引诱小朋友学习是最常用的手法,绵羊爸爸就是用糖果来引诱萌萌学习博弈的。

    描述

    他把糖果分成了两堆,一堆有A粒,另一堆有B粒。他让萌萌和他一起按照下面的规则取糖果:每次可以任意拿走其中一堆糖果;如果这时候另一堆糖果数目多于1粒,就把它任意分成两堆,否则就把剩下的一粒糖果取走并获得这次博弈的胜利。胜利者将获得所有的糖果。萌萌想要得到所有的糖果,而绵羊爸爸想把糖果留下以便下一次利用。现在由萌萌先取糖果,旁观的小朋友们想知道萌萌是否有必胜策略。

    格式

    输入格式

    本题有多组测试数据(不超过100组)。每组数据包括两行,第一行为A,第二行为B。1 ≤ A,B ≤ 2^127。输入数据以一个 -1 结束。

    输出格式

    每组数据对应一行输出。如果萌萌获胜则输出"MengMeng",否则输出"SheepDaddy"(不包括引号)。

    样例1

    样例输入1[复制]

    1
    2
    2
    3
    -1

    样例输出1[复制]

    MengMeng
    SheepDaddy

    题意:有两堆石子,任意拿一堆,如果另一堆剩下1则直接胜利,如果大于1,则可以任意分成两堆,问谁必胜。

    思路:因为有两堆石子,如果直接考虑拿哪堆有点麻烦,所以转化一下,考虑拿走后剩下一堆石子的分法是否有必胜策略。

    首先先手剩下了

    1 = 1         N    先手必胜

    2 = 1 | 1 N->P 先手必败

    3 = 1 | 2 N->P 先手必败

    4 = 2 | 2 P->N 先手必胜

    5 = 2 | 3 P->N 先手必胜

    这样发现,只要先手能分剩下石子为两个必败态,则它一定为必败态,那么对于先手来说就是必胜态,反之只要分出一个必胜态,那么对于先手来说这个分法一定是必败态。

    这样继续分析,发现5是个循环节,那么根据找到的规律,两堆中只要有一个模5为1,4,0的就是先手必胜态。

    /** @Date    : 2016-12-14-21.41
      * @Author  : Lweleth (SoungEarlf@gmail.com)
      * @Link    : https://github.com/
      * @Version :
      */
    #include<bits/stdc++.h>
    #define LL long long
    #define PII pair
    #define MP(x, y) make_pair((x),(y))
    #define fi first
    #define se second
    #define PB(x) push_back((x))
    #define MMG(x) memset((x), -1,sizeof(x))
    #define MMF(x) memset((x),0,sizeof(x))
    #define MMI(x) memset((x), INF, sizeof(x))
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+20;
    const double eps = 1e-8;
    
    int main()
    {
        char a[1000], b[1000];
        while(~scanf("%s", a))
        {
            if(a[0] == '-')
                break;
            scanf("%s", b);
            int x = strlen(a);
            int y = a[x - 1] - '0';
            x = strlen(b);
            int z = b[x - 1] - '0';
            if(y % 5 == 1 || y % 5 == 4 || y % 5 == 0)
                printf("MengMeng
    ");
            else if(z % 5 == 1 || z % 5 == 4 || z % 5 == 0)
                printf("MengMeng
    ");
            else
                printf("SheepDaddy
    ");
    
        }
        return 0;
    }
    //剩下的数为无论先手怎么拆分都: 1Y 2N 3->~(1|2)N 4->~(2|2)Y 5->~(2|3)Y 6->~(3|3)Y 7N ...
    //模5 两个数中有 余1 4 0 为必胜 否则必败
    
    
  • 相关阅读:
    线性时不变系统的频率选择滤波器
    Why Programmmers dont have a High Social Status?
    Oracle 的DBA考证
    基于matlab的FIR加窗滤波器设计
    奥本海姆《离散时间信号处理》第二版书评
    Altium Designer 发现的机密——摘自CRAZY BINGO
    sql server 2008 添加登录名
    Silverlight listbox横向排列
    IOS 摄像头使用(1)UIImagePickerController
    ios 如何获得系统时间和日期
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6219535.html
Copyright © 2020-2023  润新知