• 博弈论初步


    这是一道关于博弈的问题,希望以后考试中不会遇见:
    题目:
    P1290 欧几里德的游戏

    下面直接上代码:

       #include<bits/stdc++.h>
        using namespace std;
        typedef long long ll;
        int main()
        {
            ll c;
            cin>>c;
            while(c--)
            {
                ll x,y;
                cin>>x>>y;
                if(x<y) swap(x,y);
                bool m=true;
                while(true)
                {
                    if(x==y||x-y>=y) break;//后续证明△ 
                    else
                    {
                        m=!m;//交换身份 
                        ll t=x-y;//只取一个并不影响? 
                        x=y;y=t;continue;//变量赋值 
                    }
                }
                    if(m)cout << "Stan wins" << endl;
                else cout << "Ollie wins" << endl;
            }
        } 
    

    下面我们来对打有△标记的地方进行讲解:

    首先,我们要确定的一点就是只要一个人能够掌控全局,那么他一定赢了,这话怎么讲呢?我们举几个例子吧!(首先我们还是要假设大家都是绝顶聪明的)

    例一: 
    16 5
    那么首先若A先取:
    6 5 取2个5
    这时B没法只能取一个5
    1 5
    这时明显A赢了! 
    

    例二
    17 5
    若B先取:
    7 5
    A没法: 
    2 5
    B再取:
    2 3
    A没法
    2 1
    B赢了 
    

    例三
    5 5
    谁要是先取谁就赢了 
    

    这里我们已经把所有的可以赢得情况枚举了一遍(前两个例子可以归为一类,而后面的例子单独为一类)我们先设两个要取的数分别为x,y(默认x>y),如果x-y>y即A至少可以有两种情况,一种是把x取到小于y另一种就是把x取到大于y,而这两种一定对应A的两种生死,要么赢,要么输,而另一种即x==y则如图中所说可以肯定,先取的人必胜,所以这道题就很快的被我们解决了,对了!还有其余的情况那就安分守己的一个一个取,因为如果一下取两个一定会取得小于0的!所以综上,只有这两种情况可以判断当局者是否控制局面即胜利,其他情况都不可以!
    谢谢采纳!!!

  • 相关阅读:
    黑客防线
    基于onvif的码流转换专利
    8168开发之---1g内存换成512M的内存映射配置
    图像处理之基础---内积、点积
    3s 简介
    嵌入式开发之工具---比开发手册更重要的一个命令 man page
    图像处理之基础---频域分析
    lbp纹理特征
    28.Docker介绍与目录
    09.客户端集成IdentityServer
  • 原文地址:https://www.cnblogs.com/mudrobot/p/13331008.html
Copyright © 2020-2023  润新知