威佐夫博弈

题目类型 :

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

分析 :

  相比于巴什博弈,此种博弈得情形更加复杂些,我们用(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\n");
        else puts("1");
    }
    return 0;
}

 

posted @ 2018-05-05 21:02  楼主好菜啊  阅读(253)  评论(0编辑  收藏  举报