题目:
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;
}