mars_ch的博客

背水一战

poj 1067 取石子游戏

题目:
poj

题意:

中文题哦~O(∩_∩)O

分析:
经典又有趣的博弈问题。。

发现博弈最有意思的是这群人永远都知道 最佳游戏策略 【我怎么就不知道呢】

说正事:
这是一个博弈算法,名为威佐夫博弈。

问题:首先有两堆石子,博弈双方每次可以取一堆石子中的任意个,不能不取,或者取两堆石子中的相同个。先取完者赢。

思路:既然要先手赢,那么我们就分析一下 必败局势。
很好看出来:
(0,0),(1,2),(3,5),(4,7),(6,10),(8,13)…..
找规律可发现,所有的自然数都出现且只会出现一次。而两个数的差是递增的。而 第一个数的值=差值*1.618 即(sqrt(5)+1)/2;
所以就很好说了:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
//by mars_ch
using namespace std;
int n,m;
int temp; 
int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        if(n>m) swap(m,n);   //这个要加,宝宝没加。。。
        int k=m-n;
        //printf("%d\n",k);
        temp=floor(k*(sqrt(5.0)+1.0)/2.0);     //这个是.0  因为精度问题   还要强制转化或者向下取整一下
        //printf("%d\n",temp);
        if(temp == n) printf("0\n");
        else printf("1\n");
    }
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mars_ch/article/details/51540644
文章标签: poj
个人分类: 数论
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭