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 最小。輸入說明 輸...