zoukankan      html  css  js  c++  java
  • poj 2348 Euclid's Game(博弈)

     1 /*********************************************************
     2 题意:       有两个人玩游戏,比如有两个堆石头,一个人只能
     3               在多的那堆石头里取,并且只能取少的那堆石头里
     4               整数倍的石头。给出两堆石头的数量,两人轮流取,
     5               谁先取完其中一堆石头则胜利,并且stan先取,要
     6               给出胜利人的名字
     7               
     8 算法:        博弈
     9 
    10 解题思路:    假设一个这样的状态T1=(x,y),并且x>y,那么状态
    11               T2=(x+y,y)可以到达T1,并且两者之间一个为必胜状态,
    12               那么另外一个为必败状态但是,T3=(x+2y,y)既可以到
    13               达T1状态,又可以到达T2状态,那么我们可以说T3状态
    14               是一个必胜状态,同理T4=(x+3y,y),...(x+4y,y)等几个
    15               状态,也同样可以到达T1与T2状态,那么这些状态也为
    16               必胜状态所以我们说如果满足x>=2y,则为必胜状态,如
    17               果是y<x<2y,这种情况,下个状态只能为(x-y,y),为了保
    18               证前面一个数大于后面一个数,我们会将两者交换x不可
    19               能小于y,因为前提假设了x>y如果x==y,或者x=0或者y=0,
    20               那么当前取石子的人胜利
    21 ***********************************************************/
    22 #include<cstdio>
    23 #include<cstring>
    24 #include<algorithm>
    25 #include<iostream>
    26 using namespace std;
    27 
    28 int dfs(int n,int m,int p)
    29 {
    30     if (n%m==0||n-m>m) return p;         ///此处n-m>m一定不能写成n>m*2
    31     if (n-m<m) return dfs(m,n-m,p^1);
    32 }
    33 
    34 int main()
    35 {
    36     int n,m;
    37     while (~scanf("%d%d",&n,&m)&&m+n)
    38     {
    39         if (n<m) swap(n,m);
    40         int flag=dfs(n,m,1);
    41         if (flag) printf("Stan wins
    ");
    42         else printf("Ollie wins
    ");
    43     }
    44 }
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/pblr/p/5708780.html
Copyright © 2011-2022 走看看