hdu2177威佐夫博弈

2021-08-02 23:44:25 字數 813 閱讀 5520

其實就是分析一下威佐夫博弈的原理,

先設小的數量的一堆是a,

大的數量的一堆是b

如果(b-a)*(sqrt(5)+1)/2等於小的值,那麼就可以保證後手贏

那麼分析先手贏的原理便是先手拿了一次後使新的差值*(sqrt(5)+1)/2等於小的值即可

第一次拿有兩種情況:

1、如果第一次在兩堆中拿的數目相同,那麼差值是不會變的,那麼就能很容易得到拿了一次後兩堆中數量小的值

如果得到的這個小的值小於a,那麼就是符合條件的  

2、如果不同,可以從1到b-1遍歷一下差值(新的差值不可能是0或b,因為這樣都能保證後手再拿一次就贏)

如果得到的新的一組資料能保證有乙個等於a或b,另乙個小於b或a就說明是滿足條件的了

還有一種特殊的情況,便是第一次就能拿走全部的,也就是0,0情況,由於上述2是從1開始遍歷的

所以不涉及這種情況,可以單獨拿出來。

#include#include#include#include#include#includeusing namespace std;

int main()

{ int a,b;

while(scanf("%d%d",&a,&b)!=-1)

{if(a==0&&b==0) break;

if(a>b) swap(a,b);

int c=b-a;

int w=(int)((sqrt(5)+1)/2*c);

if(w==a) printf("0\n");

else

{printf("1\n");

int m,n;

if(w

hdu2177威佐夫博弈

這題由於資料水1a掉了,我的 只對大的一堆進行操作也能ac,事實上應該將對小的操作情況也考慮進去,但是題目沒有給出輸出順序。思路 先用 分割乘以差值與小堆進行判段,若相等,為奇異局勢,直接輸出零。否者用二分搜尋對某一堆的操作。include includeusing namespace std co...

hdu2177 威佐夫博弈變形

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。如果...

取 2堆 石子遊戲(威佐夫博弈 hdu2177)

t 取 2堆 石子遊戲 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2177 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊...