海盜分贓演算法題

老碼農發表於2014-06-05

#演算法題# 6個海盜要分贓300金幣。規則是由資格最老的海盜提出各人分到的數量,然後全體投票。如方案得到至少半數同意票,則按該方案執行,否則提出方案的海盜被殺死,再由剩下人中資格最老的繼續提出方案。海盜都很聰明,在能生存的前提下會追求獲利最大化。問最後分贓結果是怎樣的?

這個題挺有意思的,主要測試的是一種簡化問題的思維能力,類似於中學數學裡的證明題,先看n=0是否成立,然後假設n-1成立,證明n也成立。

如果從6個人的角度來看確實無從下手,看起來似乎每個人都有投反對票把資格最老的海盜弄死然後自己多分點的傾向,但是每個人能分到多少又想不明白。

因為變化實在太多了,那就先假設海盜們亂投了一氣,殺死了四個海盜,最後只剩下了兩個人吧。

這下輪到老五提出方案了。他一看就剩倆人,那我們自己一票就是50%,不用管老六是否贊成,太好了!於是根據生存&&獲利最大化原則,他把300個金幣都分給了自己,老六啥也沒得到,而且一投票就通過了,他一點辦法也沒有。

所以,當n=2的時候,本演算法題得到了第一個確定而且穩定的結果:(300,0)。下面可以倒推n=3,4,5,6的情況。

看到這個結果,老六傻眼了。合著自己攙和了半天啥也沒有啊,而且還害死了前面對自己挺好的幾個前輩,太虧了! 於是老六對上帝祈禱:“上帝啊,如果再給我一次重來的機會,我一定會對老四說:我投你,如果非要給這句話加上一個期限,我希望是一萬年!”

話說也巧了,上帝正好從旁邊路過,聽到如此熟悉而虔誠的禱告,不禁心生惻隱,於是現身對他們說:“好吧,既然你背了我的好基友孫悟空的臺詞,那我就滿足你的這個請求。”

老五一看不幹了:“Ooooooh Nooooooo!上帝啊,你可不能偏心!”

可是上帝必須是有身份證的體面人,是要講信譽講誠信的。所以一下子那四個死去的海盜又復活了,開始重新分配贓物。

老六首先嘀咕著:“老五真不是東西,剩下倆人就欺負我。這次只要老四給我一個金幣,我就投贊成票!反正無論如何也輪不到我來分,到老五這兒就game over了…”

老五一聽急了:“要是這樣,老四可以一個大子都不給我就以2:1的票數通過了,不幹!如果老三給我一個金幣,我就贊成老三,我們倆50%贊成票,讓老四老六都喝西北風去!”

老四奸笑著說:“ 別鬧了,你們倆想黑我,沒門。這回我知道有老三在前面,加上老五和他狼狽為奸,肯定輪不到我來分。這樣吧,老二給我一個金幣就行了,再給老六一個,這樣我們仨就通過了,嘿嘿,輪不到老三分配就結束!”

老三怒了:“老大還活著呢!老二算神馬東西!讓老大分!老大給俺和老五各一個金幣,我們哥倆就支援你,3票就夠了,其他人反對也沒用!”

老大嘿嘿一笑:“真的?你娃上回把老子給害死了,這次老子能信你?”

老三哭著說:“老大你大人不記小人過,上回我不是也被他們害死了麼?這次我要不支援你我就是個錘子,你想啊,老二分的話我啥都拿不到,你老給我一個金幣我已經感激不盡了!”

老五也趕緊表忠心:“老大你就這麼定吧,我們要是投了反對票就輪到老二分了,按照老四老六的意思,我和老三都得喝西北風啊!上帝在旁邊見證,要是我們倆言而無信,出門就被車撞死!”

上帝不屑地哼了一聲:“我在這裡還要什麼車撞,我拿塊豆腐都能砸死你們信不?”

老三老五嚇得連連點頭:“我信,我信!”

老二老四老六一看形勢危急,紛紛嚷嚷起來:“老大,這倆小子不能信啊!”

老大看了看他們:“不信他們難道信你們?最不可信的就是老二,他就盼著我死好拿大頭呢,以為我傻啊?哼哼。”

老二無話可說,鬱悶地蹲到一邊抽菸去了。老四老六還不甘心:“老大,害死你老二肯定是最賺的,所以他肯定投反對票。可我們也沒多大盼頭不是?最多也就得一個金幣。您老別給老三老五金幣,給俺們,俺們投你也是一樣的兩票嘛!”

老大想了想說:“不行。如果老子死了老二來分,你們也能得一個金幣,所以老子要給你們一個金幣對你們來說沒區別,除非老子給你們倆金幣才能保證你們不反水。可這樣不如給老三老五各一個金幣划算。嘿嘿,你們別忽悠老子,老子死了一回現在學乖了!”

上帝越聽越糊塗,有點不耐煩地打斷了他們:“你們說的都什麼玩意?玩邏輯是不?欺負俺們文科生唄?趕緊的,1000年前我約好了和孫悟空一起去塔圖因星踢球,還有十幾萬光年的山路要趕,沒工夫聽你們在這兒扯淡。”

老大一看大局已定,於是莊嚴地咳嗽一聲,說道:“那老子就提了。老二老四老六得0個,老三老五得1個,老子拿298個。”

老二老四老六自然不幹,都投了反對票。老三老五投了贊成票,加上老大自己一票,正好50%贊同,於是六個海盜分完贓物,心情各異地走了。

只有上帝呆在了原地,這個結果還真是出乎他的意料啊!又過了100年他終於琢磨明白了,自言自語地說:“演算法這門學問還真是博大精深!應該好好學學!”

於是上帝拿出手機,上網買了本原版的《演算法設計手冊》 ,然後給孫悟空打電話:“喂老孫不好意思,我有事不去踢球了。啥事?那啥,我得回去學演算法….”

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

海盜分贓演算法題 海盜分贓演算法題

相關文章