原帖:
project euler
上最近的題目都還比較意思,來看看前些天剛剛新鮮出爐的一道題:
problem232
,大意如此:說,有這樣乙個硬幣遊戲,需要兩個玩家參與,我們不防分別將他們稱為玩家
1和玩家
2。遊戲規則如下:兩個玩家輪流來擲硬幣。玩家
1每次只能擲一次,若是正面向上,則得
1分,否則不得分。玩家
2每次可以選擇拋擲硬幣的次數t(
t>0
),若每次都是正面向上,則得分為2的
(t-1)
次方,否則不得分。首先由玩家
1先擲,先得分超過
100者為贏家。現在問:假設玩家
2每次都選擇最優的投擲次數,則他贏的概率是多少?當然,每次的投擲都是完全公正和隨機的,否則要來個劉謙,這概率就沒法算了。
首先,可以憑直覺猜猜這個概率大概是多少。毫無疑問,大於
1/2是肯定的,因為玩家
2至少可以選擇每次都只擲一次,在得分目標(
100分)相對較大的時候,後擲的劣勢可以忽略。嗯,好像沒有其它線索了,不太好猜啊,還是老老實實算吧。
像這種算概率的題通常都比較麻煩,雖然很容易想到思路,但很難得到準確的答案。比如在這裡,乙個很容易想到的思路是動態規則。設
p ( i, j )
是當玩家1得到
i分,玩家2得到
j分,並且此時輪到玩家
2拋擲時玩家
2獲勝的最大概率。從後往前推,先看
p(99, 99)
。此時,玩家
2選擇的拋擲次數肯定為
1,得一分就夠了,多了也浪費,還降低了得分的概率。當玩家
2丟擲硬幣後,得到兩種結果:得
1分,不得分。得
1分就直接贏了,而不得分就把主動權交給了玩家
1,而當玩家
1再次丟擲後,又得到兩種結果:得
1分,則玩家
1贏得遊戲,不得分,則整個局勢又回到
p(99,99)
的初始狀態。上述過程有表示式如下:p(
99,99)
= 1/2 +
(1/2 * 1/2
)* p(99
,99)解上述方程,可得
p(99, 99)
得2/3
。注意到,上述表示式是乙個邊界情況,因為兩個玩家都是再得一分即可獲得勝利,現在推導乙個更一般的狀態轉移方程。設在該輪玩家
2選擇的投擲次數為
n, 這樣可以得的分數s為
2^(n-1)
,得分概率o 為
1/2^(n+1)
。則有:p'(
i, j
)= o*(1/2)*p(i, j+s) + o*(1/2)*p(i+1, j+s) + (1-o)*(1/2)*p(i+1,j) + (1-o)*(1/2)*p'(i,j)
注意到上邊的式子兩邊都有 p
'( i, j )
,所以是個隱式表示式。(昨天寫漏了,加上一句)列舉所有使得(s+j)小於或者剛好大於100的n,計算上式中的p'(i, j),則有p(i, j)為這些p'(i, j)的最大值。當然,玩家2也可以選擇令(s+j)遠遠大於100的投擲次數n, 但比較顯然的是這樣得到的p』(i, j)不會是最大的,比如前面所說的,在p(99, 99)的局勢中玩家2明顯不會選擇超過1的投擲次數。有的地方只所以乘了二分之一是因為狀態轉移還需要玩家
1的過渡,因為我們的狀態定義是在當輪到玩家
2拋擲時玩家2
獲勝的最大概率。為了表達方便,沒有考慮一些邊界的情況。然後按照上面的轉移方程編寫程式就行了,這道題的答案為:
0.83648556.
這個答案是不是比用直覺猜的要高些呢。(我是猜的大概在
2/3左右,誤差不小),這首題其實非常適合用來做面試題:生動有趣,即不是太簡單,也不是太難(比起以其相似的
poj1074
算是小烏見大烏了),雖然比較容易想到演算法,卻也不容易一次性算對。爺爺的,要是本人以後有榮幸當上面試官,一定要出出這道題。
1381硬幣遊戲
基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況...
1381 硬幣遊戲
1381 硬幣遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些...
硬幣遊戲 期望
有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...