XDOJ1011 金子上的友情

2021-06-23 06:10:23 字數 3300 閱讀 1406

description

wm 和qinz 是一對好朋友,他倆有著一段偉大的友誼,然而這段友誼是建立在一場殘酷的競爭之後的英熊惺惺相惜,那場戰鬥是這樣的

----------------------我------是------華------麗--------的-------分--------割----------線------------------

地上有三堆金子,第i堆裡面a[i]顆金子,每個人輪流從任意一堆金子中取出來任意多顆,當然取出來的顆數不能超過這堆金子的剩餘量,現在告訴你這三堆金子每堆的顆數,如果場上三堆金子都剩餘0顆的話,沒金子可取的那個人要把手中取到的金子全部交給對方,並且對方獲勝。

wm先取金子,輸出最後獲勝的人的名字

input

每行三個數,分別為第一,第二,第三堆金子的顆數(0<=顆數<2^16),題目可能包含多組資料。

output

輸出獲勝者的名字

sample input

1 1 1

1 2 3

sample outputwm

qinz

解題思路:

看到這個題的第乙個感覺它是一道博弈的題,但是自己是對博弈不是很了解,於是乾脆上網上搜尋。原來這是乙個nim game博弈,參考:

(1)巴什博弈(bash game):只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者勝。

顯然,如果n=m+1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少,後取者都能一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則:如果n=(m+1)r+s,(r為自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。

這個遊戲還有乙個變相的玩法:兩個人輪流報數,每次至少報乙個,最多報10個,誰能報到100者勝。

(2)威佐夫博弈(wythoff game):有兩堆各若干物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取1個,多者不限,最後取光者勝。

這種情部下是頗為複雜的。我們用(ak,bk)(ak≤bk,k=0,1,2,...,n)表示兩堆物品的數並稱其為局勢,如果甲面對(0,0),那麼甲已經輸了,這樣局勢我們稱為奇異局墊勢。前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

可以看出,a0=b0=0,ak是未在前面出現過的最小自然數,而bk = ak+k,奇異局勢有如下三條性質

事實上,若只改變奇異局勢(ak,bk)的某乙個分量,那麼乙個分量不可能在其他奇異局勢中,所以必然是非奇異局勢。如果使(ak,bk)的兩個分量同時減少,則由於其差不變,且不可能是其他奇異局勢的差,因此也是非奇異局勢。

《3》採用適當的方法,可以將非奇異局勢變為奇異局勢。

假設面對的局勢是(a,b),若b=a,則同時從兩堆中取走a個物體,就變為奇異局勢(0,0);如果a=ak,b>bk,那麼取走b-bk個物體,即變為奇異局勢;如果a=ak,bak, b=ak+k, 則從第一堆中拿走多餘數量a-ak即可,如果a從如上性質可知,兩個人如果都採用正確操作,那麼面對非奇異局勢,先拿者必勝;反之,則後拿走取勝。

那麼任給乙個局勢(a,b),怎麼判斷它是不是奇異局勢呢?我們有如下公式:

ak =[k

(1+√5

)/2]

,bk= ak + k 

(k=0,1

,2,...,n

方括號表示取整函式)

奇妙的是其中出現了**分割數(

1+√5

)/2 = 1

。618...,因此,

由ak,bk

組成的矩形近似為**矩形,由於2/(

1+√5)=

(√5-1)/2

,可以先求出

j=[a

(√5-1

)/2]

,若a=[j

(1+√5

)/2]

,那麼a = aj

,bj = aj + j

,若不等於,那麼

a = aj+1

,bj+1 = aj+1+ j + 1

,若都不是,那麼就不是奇異局勢。然後再按照上述法則進行,一定會遇到奇異局勢。

(3)尼姆博奕(

nimm game

):有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。

這種情況最有意思,它與二進位制有密切關係,我們用(a,

b,c)表示某種局勢,首先(0,

0,0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,

n,n),只要與對手拿走一樣多的物品,最後都將導致(0,

0,0)。仔細分析一下,(1,

2,3)也是奇異局勢,無論對手如何拿,接下來都可以變為(0,

n,n)的情形。

計算機演算法裡面有一種叫做按位模

2加,也叫做異或的運算,我們用符號(

+)表示這種運算。這種運算和一般加法不同的一點是

1+1=0

。先看(1,

2,3)的按位模

2加的結果:

1 =二進位制

012 =

二進位制10

3 =二進位制11(

+)———————

0 =二進位制

00(注意不進製)

對於奇異局勢(0,

n,n)也一樣,結果也是0。

任何奇異局勢(a,

b,c)都有a(

+)b(

+)c =0

。如果我們面對的是乙個非奇異局勢(a,

b,c),要如何變為奇異局勢呢?假設 

a < b< c,

我們只要將 c變為

a(+)

b,即可

,因為有如下的運算結果

: a(+)

b(+)

(a(+)

b)=(a(+

)a)(+

)(b(+

)b)=0(+

)0=0

。要將c變為a

(+)b

,只要從 

c中減去 c-(

a(+)

b)即可。

#includeusing namespace std;

int main()

return 0;

}

XDOJ括號匹配

類別 字串處理 時間限制 2s記憶體限制 1000kb 問題描述 表示式中的合法括號為 這三種括號可以按照任意的次序巢狀使用。請寫乙個程式,判斷給定表示式中的括號是否匹配,既左右括號順序和數量都匹配。輸入說明 輸入為乙個表示式字串,長度不超過50。輸出說明 對輸入的表示式,若其中的括號是匹配的,則輸...

XDOJ快速排序

問題描述 採用快速排序演算法,排序輸入的n個整數,prvotkey 樞軸 每次選取陣列第乙個數。輸出快速排序第一趟排序的結果。輸入格式 輸入的第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數,空格隔開。輸出格式 按照要求排序後輸出,由空格分隔。樣例輸入 50 10 90 30 70 4...

XDOJ 分配寶藏

問題描述 兩個尋寶者找到乙個寶藏,裡面包含n件物品,每件物品的價值分別是w 0 w 1 w n 1 suma代表尋寶者a所獲物品價值總和,sumb代表尋寶者b所獲物品價值總和,請問怎麼分配才能使得兩人所獲物品價值總和差距最小,即兩人所獲物品價值總和之差的絕對值 suma sumb 最小。輸入說明 輸...