• poj 2348 Euclid's Game


    题目:

    给两个整数a和b,两个人先后用较大的数减去较小数的整数倍,并且保证相减后为非负数。先把一个数变为0的人获胜。

    分析:

    很显然,当大数是小数的整数倍时为必胜态。

    从这道题学会一个叫做自由度的东西,感觉能够为博弈推理提供思路。

    博弈基本就是一个推理必胜态和必败态的过程。自由度越低越好推理。

    不妨假设b为两个数中的较大数。

    如果b-a<a

    那么只能选择用b去减a,如果后继态是必胜态,那么该状态是必败态,否则就是必胜态。

    如果b-a>a呢?

    我们怎么能够转移到自由度较低的情况。

    假设x是是的b-x*a<a的整数。

    那么我们用b减去(x-1)*a。这个就变成了第一种情况,如果第一种情况是必败态,那么此时就是必胜态。

    如果减去(x-1)*a是必胜态呢?那么b-a*x是不是就变成了必败态?(有点绕,仔细想想),所以当前状态还是必胜态。

    所以就是比谁先达到自由度高的情况即可。

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int main( )
    {
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF)
        {
            if(a==0&&b==0)
            break;
    
            bool f=true ;
            while(1)
            { if(a>b)
            swap(b,a);
                if(b%a==0)
                break;
                if(b-a>a)
                break;
                b-=a;
                f=!f;
            }
            if(f)
            puts("Stan wins");
            else
            puts("Ollie wins");
    
        }return 0;
    }
  • 相关阅读:
    iOS 面向对象
    iOS 构建动态库
    iOS 单例
    iOS 操作系统架构
    iOS 编译过程原理(1)
    Category
    CoreText
    dyld
    block
    (CoreText框架)NSAttributedString 2
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9553716.html
Copyright © 2020-2023  润新知