HDU - 1527 取石子游戏(威佐夫博弈)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 1527 取石子游戏(威佐夫博弈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:有兩堆石子,兩個人輪流取,每次可以取一堆中任意多的石子,或者取兩堆中數量相同的石子,先將石子取完者獲勝,若先手獲勝輸出1,后手獲勝輸出0
題目分析:這個題目涉及到了威佐夫博弈
威佐夫博奕(Wythoff Game):有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取一個,多者不限,最后取光者得勝。
這種博弈有兩種局勢,一種是奇異局勢,一種是正常局勢,我們可以理解為奇異局勢是先手必敗的局勢,正常局勢就是后手必敗的局勢。
該怎么理解奇異局勢呢?其實我也不太理解,但我隊友和我說了該怎么計算之后,大概還是能記住這個公式該怎么用了
從小到大我來枚舉幾個奇異局勢:
先枚舉這么十個奇異局勢,那么我們該怎么判斷一個局勢是否屬于奇異局勢呢?
這里介紹一個很奇怪的公式。。我們設黃金分割比例k=
我們設每一個奇異局勢為(min,max)
上面的每一個奇異局勢前面都有一個序號,代表的也是兩個數字之差,也正是max-min
而每一個min都是可以計算出來的
(向下取整)
這樣一來給出一個局勢就可以根據其絕對值之差來判斷是否屬于奇異局勢了
代碼:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=4100;int main() {int a,b;while(scanf("%d%d",&a,&b)!=EOF){int mmin=min(a,b);int mmax=max(a,b);int k=mmax-mmin;int temp=(k*(1+sqrt(5.0))*0.5);if(temp==mmin)printf("0\n");elseprintf("1\n");}return 0; }?
?
總結
以上是生活随笔為你收集整理的HDU - 1527 取石子游戏(威佐夫博弈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 3258 River Hop
- 下一篇: POJ - 2348 Euclid's