PTA海盜分贓(25分)

PTA海盜分贓(25分)

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<iostream>
using namespace std;
int main(void){
	int D,P;
	cin>>D>>P;
	if(P==3) cout<<D-1<<endl;
	else cout<<D-(P/2+1)<<endl;
	return 0;
}

原創鏈接,感謝老哥:https://blog.csdn.net/TOBEALISTENNER/article/details/79896856

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章