p 個海盜偷了 d 顆鑽石後來到公海分贓,一致同意如下分贓策略:
首先,p 個海盜通過抽籤決定 1 - p 的序號。然後由第 1 號海盜提出乙個分配方案(方案應給出每個海盜分得的具體數量),如果能夠得到包括 1 號在內的絕對多數(即大於半數)同意,則按照該分配方案執行,否則 1 號將被投入大海喂鯊魚;而後依次類似地由第 2 號、第 3 號等等海盜提出方案,直到能夠獲得絕對多數同意的方案出現為止,或者只剩下最後一位海盜,其獨佔所有鑽石。請編寫乙個程式,給出第 1 號海盜的鑽石分配方案中自己分得的鑽石數量。
附帶的三個假定:
輸入格式:
輸入在一行中給出 2 個正整數 d 和 p(3≤p≤d≤100)。輸出格式:
輸出第 1 號海盜的鑽石分配方案中自己分得的鑽石數量。輸入樣例:
10 7
輸出樣例:
6
這個題很有意思,之前這類題我也在博弈論的書上看到過,第一次寫關於這個問題的演算法,也是很新奇。
如果寫在紙上,就不難發現他們的規律 讓我們來寫一下
(1)兩個人
1 海盜無論自己得到多少,2肯定不同意,因為沒有超過半數,所以只有 1 把所有的財產給 2 ,才能活命。
所以分配的結果為 : 0,d
(2)三個人
1 為了拉選票,肯定要籠絡那些沒有金幣的人,那麼金額為0就是首選的籠絡人才,而上面我們能看到 此刻的 2 金額為 0,其次打擊財產最多的人(因為你無論給他多少(自身盈利的情況下)他都不會滿足,所以不用考慮他的分配),所以 3 金額變成 0
所以分配的結果為 :d-1,1,0
(3)四個人
同樣適用(2)的理論 那麼此刻的 2 金額一定為 0 ,最後的人即 4 為拉攏物件,但是這樣還不會超過半數,那麼 3 就會比上次的多分配一枚金幣
所以分配的結果為 :d-3,0,2,1
(4)五個人 (超過一大半也就是有 3個人支援)
同上面的理論,拉選票就從金額最小的人(0個金幣)開始,如果不夠,則考慮1個金幣的人,如果人數夠了,那麼剩餘人將分不到金幣(自身利益最大化)
所以分配的結果為 :d-3,0,1,0,2
慢慢慢慢大家就會發現 海盜的人數超過三個人的時候就會出現規律
(5)六個人 分配的結果:d-4,0,1,2,1,0
(6)七個人 分配的結果:d-4,0,1,2,0,0,1
(7)八個人 分配的結果:d-5,0,1,2,0,1,1,0
(8)九個人 分配的結果:d-5,0,1,2,0,1,0,0,1
(9)十個人 分配的結果:d-6,0,1,2,0,1,0,1,1,0
發現規律了嗎?
沒錯每次只需要給上一次金幣數為0的傢伙一枚金幣,再給其中乙個上一次得到一枚金幣的傢伙兩枚金幣,第乙個海盜選票就超過一大半了!
那麼轉化為數學規律 當人數超過三個人的時候 第乙個海盜得到的金幣為: d - (p / 2 + 1)
**如下:
#include
using
namespace std;
intmain
(void
)
原創鏈結,感謝老哥: PTA 海盜分贓
p 個海盜偷了 d 顆鑽石後來到公海分贓,一致同意如下分贓策略 首先,p 個海盜通過抽籤決定 1 p 的序號。然後由第 1 號海盜提出乙個分配方案 方案應給出每個海盜分得的具體數量 如果能夠得到包括 1 號在內的絕對多數 即大於半數 同意,則按照該分配方案執行,否則 1 號將被投入大海喂鯊魚 而後依...
海盜分贓(找規律)
題目 p 個海盜偷了 d 顆鑽石後來到公海分贓,一致同意如下分贓策略 首先,p 個海盜通過抽籤決定 1 p 的序號。然後由第 1 號海盜提出乙個分配方案 方案應給出每個海盜分得的具體數量 如果能夠得到包括 1 號在內的絕對多數 即大於半數 同意,則按照該分配方案執行,否則 1 號將被投入大海喂鯊魚 ...
兄弟分錢 海盜分贓
類似的反推問題。問題描述 1 媽媽有2000元,要分給她的2個孩子。由哥哥先提出分錢的方式,如果弟弟同意,那麼就這麼分。但如果弟弟不同意,媽媽會沒收1000元,由弟弟提出剩下 1000元的分錢方式,這時如果哥哥同意了,就分掉這剩下的1000元。但如果哥哥也不同意,媽媽會把剩下的1000元也拿走,然後...