• 威佐夫博弈


    题目类型 :

      有两堆物品数量若干,两人轮流从某一堆或同时从两堆中选取同样多的物品,规定每次最小选一个,多者不限,最后一次取尽者获胜。

    分析 :

      相比于巴什博弈,此种博弈得情形更加复杂些,我们用(X , Y)表示当前得局势,如果甲面对(0 , 0)说明甲输掉了比赛,我们称这种状态是奇异局势,前几个奇异局势是 (0 , 0) , (1 , 2) , (3 , 5) , (4 , 7) , (6 , 10) , (8 , 13) , (9 , 15) , (11 , 18)

      可以看出,x是未在前面出现过得最小自然数,并且经过任何操作,都可以将奇异局势变成非奇异局势

      现在,如果给你一个局势(x, y),如何判断他是不是奇异局势

      

      x  = k * (1 + sqrt(5) )/2 ; y = x + k

      对于一个当前的局势如果 (y - x) * ((1 + sqrt(5) )/2 ) = x

    代码示例 :

      

    double pp = 1.0*(1.0+sqrt(5.0))/2.0;
    
    int main() { 
        int x, y;
        
        while(~scanf("%d%d", &x, &y)){
            if (x > y) swap(x, y);
            
            int k = y - x;
            if (x == (int)(1.0*k*pp)) printf("0
    ");
            else puts("1");
        }
        return 0;
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    第二章—数据类型字符串str
    第二章—数据类型列表list
    第二章—编码
    第二章——进制
    ConfigParser模块
    描述符__get__,__set__,__delete__
    面向对象 ,特殊成员和魔法方法
    异常处理
    反射
    绑定方法与非绑定方法
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8996129.html
Copyright © 2020-2023  润新知