A - 无聊的游戏 HDU - 1525(博弈)

A - 无聊的游戏 HDU - 1525

疫情当下,有两个很无聊的人,小A和小B,准备玩一个游戏,玩法是这样的,从两个自然数开始比赛。第一个玩家小A从两个数字中的较大者减去两个数字中较小者的任何正倍数,前提是得到的数字必须是非负的。然后,第二个玩家小B对得到的两个数字做同样的处理,两个玩家交替进行,直到一个玩家能够从大的数字中减去较小数字的倍数,达到0,从而获胜。例如,玩家可以从(25,7)开始:

25 7 
11 7 
4 7 
4 3 
1 3 
1 0 

这是个 小A 获胜的例子.

Input 多组输入,不超过6组。每行为一组数据,包含两个正整数M,N(M,N<231)。 Output
对于每一行输入,输出一行,若小A获胜,那么输出“Stan wins”否则输出“Ollie
wins”。假设这两个玩家都玩得很好。最后一行输入包含两个零,不应进行处理。

Sample Input
34 12
15 24
0 0
Sample Output
Stan wins
Ollie wins

思路

  • 题意:有两个数字a、b, 有两个人在用这两个数字完博弈,它们轮流用 两个数字中较大的数 - 另一个数任意倍(但要求相减的出来的数是一个非负的数),得到的结果在复制给那个较大的数,问谁先把这两个数相减 使得结果出现0,那么此时这个人就获胜。
  • 分析:
    1.在进行每一步操组之前,我们默认都是 a >= b, 如果不是,就交换两个数的值。
    2. 如果 a == b 或者 a %b == 0,那么当前正要操作的人一定赢
    3. 如果 \(a>2*b\), 那么当前正要的操作的人一定能赢,因为当前正要操做的人一定知道:a%b、b 这个状态是必胜态,还是必败态(必胜态:指的是 无论那个人咋在这个状态进行任何操作,都一定会胜),如果这个状态是必胜态,那么这个只需让操作值的结果为a%b+b、b,那么在另一个人只能把a%b+b、b变为a%b、b,那么接下来就又是这个人在必胜态上操作,这个人就必胜;如果 a%b、b为必败态,那这个人在操作之后把结果变成 a%b、b,那么另一个人在这个必败态上操作,那么一定数,所以还是这个人赢
    4. 如果\(b <a<2*b\)的话,就只能一步步的两数相减下去,直到遇见必胜态或必败态"a%b == 0 || a >= 2b"

题解

#include<iostream>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
void Swap(int & a, int & b)
{
    if(a < b)
        swap(a, b);
}

int main()
{
    /* freopen("A.txt","r",stdin); */
    int a, b;
    while(scanf("%d %d", &a, &b) && a + b)
    {
        Swap(a, b);
        int win = 0;

        while(b)
        {
            if(a % b == 0 || a / b >= 2) break;  //这个地方是必胜态
            a -= b;
            Swap(a, b); 

            win ^= 1;
        }

        if(win == 0)
            printf("Stan wins\n");
        else
            printf("Ollie wins\n");
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lql-nyist/p/12636734.html