ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game

2019-09-02 23:05:03  阅读:210  来源: 互联网

标签:11 mmax return int Luogu P1290 UVA10368 mmin Judge


Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game

对于博弈论的题目没接触过多少,而这道又是比较经典的SG博弈,所以就只能自己来推关系……
假设我们有两个数\(m,n\),我们先把\(m\)设为较大值,\(n\)设为较小值。现在我们把它分成三种情况:
1.若两数为倍数关系,当前操作的一方赢。
2.若\(m \div n>1\),那么还是操作一方赢。
为什么呢?
拿\((25,7)\)来举例。这时的操作方就有三种选择:\((8,7)\),\((11,7)\),\((4,7)\),
如果他选\((18,7)\),那后者就面对的是\((11,7)\)或\((4,7)\);而如果他不选\((18,7)\),那么他面对的还是\((11,7)\)或\((4,7)\)。
此时我们会发现,\((11,7)\)和\((4,7)\)是必有一个能赢的,而两人都会选择最优策略,所以谁有选择权谁就能赢,也就是说他不能选\((18,7)\)。
所以易知,谁有选择权谁就能赢。
3.商为\(1\),则继续
举个例子,如\((6,4)\),这时先手没有选择权,那就只能继续,如\((2,4)\)。
综上所述,那么代码也就很容易写了。
(两道题的读入略微有些不同)

Luogu 1290

#include<bits/stdc++.h>

using namespace std;

int c,m,n;

bool Judge(int m,int n) {
    int p=0;
    while(1) {
        p++;
        int mmax=max(m,n),mmin=min(m,n);
        m=mmax;
        n=mmin;
        if(m%n==0||m/n>1) {
            return p%2;
        }
        else {
            m-=n;
        }
    }
}
int main()
{
    scanf("%d",&c);
    for(int i=1;i<=c;i++) {
        scanf("%d%d",&m,&n);
        if(Judge(m,n)==1) {
            printf("Stan wins\n");
        }
        else {
            printf("Ollie wins\n");
        }
    }
    return 0;
}

UVA10368

#include<bits/stdc++.h>

using namespace std;

int c,m,n;

bool Judge(int m,int n) {
    int p=0;
    while(1) {
        p++;
        int mmax=max(m,n),mmin=min(m,n);
        m=mmax;
        n=mmin;
        if(m%n==0||m/n>1) {
            return p%2;
        }
        else {
            m-=n;
        }
    }
}
int main()
{
    while(scanf("%d%d",&m,&n)&&(m!=0&&n!=0)) {
        if(Judge(m,n)==1) {
            printf("Stan wins\n");
        }
        else {
            printf("Ollie wins\n");
        }
    }
    return 0;
}

标签:11,mmax,return,int,Luogu,P1290,UVA10368,mmin,Judge
来源: https://www.cnblogs.com/luoshui-tianyi/p/11449572.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有