海盜分金幣

2021-07-11 14:37:34 字數 1515 閱讀 9352

問題描述

有n個海盜,得到了m個金幣。他們決定將之瓜分。分的方法是站成一排,從1號到n號海盜依次提出方案。如果提出的方案得到的支援人數比例超過q%(0<=q<100),那麼就通過方案,進行分配,提出方案的海盜也有投票權。否則就把提出方案的人扔到海浬喂鯊魚。

海盜都是精明的,他們能夠分析出如何最大化自己的利益。

海盜是貪婪的,總是選擇更大的利益。

海盜是**的,如果利益相同,更願意殺人。

輸入n,m,q,問第乙個人最多可能得到多少金幣。如果必死無疑,輸出-1.

n<=10000, m<=1000000000

樣例解析:

當有乙個人的時候,他能夠拿到所有的100個金幣。

當有兩個人的時候,後乙個人永遠不會同意前一人的方案,即必死無疑,等於-1。

當有三個人的時候,第一人選擇自己拿走100個,其他人不給。此時第二人如果不支援,就必死,故一定會支援。

當有四、五個人的時候,分配方案如下:

1個人:100

2個人:100  -1

3個人:  0   0 100

4個人:  1   1   0  98

5個人:  2   0   1   0  97

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

5 100 50↵

以文字方式顯示

97↵1秒64m0

題解思路

大致思路;

因為每個人都是聰明絕頂的,並且是殘忍的,所以第乙個人知道後面所有人的方案,所以第乙個人要想使自己的方案被採納就必須要賄賂其他的n*p/100個人才行。賄賂的時候就找最好賄賂的人進行賄賂。

具體實現:

從1個人遞推到n個人,對於每一次的遞推,先判斷新加入的人是否會死,然後如果不會死的話就將要賄賂的人的期望加1,其他的人的期望賦為0,然後排序,將期望小的放在最前面方便下一次賄賂。

注意:由於時間限制,所以排序的時候需要注意。我們在排序的時候發現,每次需要排序的都是兩個有序的序列,所以我們只需要把這兩個序列交換一下位置就可以了,這樣從1開始每次都是這樣有序排的,可以節省很多時間。

實現**

#include#include#includeint main()

else

else if(i!=n)

if(sum>m)

a[k+1]=temp1;

break; } }

}} else

if(sum>m)

else

for(k=1;k<=huilu;k++)

for(j=huilu+1,k=0;j0;k--)

a[k+1]=temp2;

break; } }

printf("%d\n",a[n-1]);

} } }}

return 0;

}

海盜分金幣

首先,把這個問題轉換為乙個遞迴的演算法問題,描述為,如果我知道了上一家的分法,我如何能夠使我的利益最大化呢?現假定有5個人分,金幣總數是100,那麼第二個人的分法是1,1,0,98,那麼第乙個人需要的就是拉攏分的最少的兩人,然後給他們多乙個金幣,這樣就可以取得他們的支援了,所以第乙個人的分法是2,0...

海盜分金幣

有5個海盜,獲得了100枚金幣,他們約定乙個分配方案.商議方式 1.有5個海盜輪流提出分配方案 2.如果超出半數海盜 包括提出者 同意該方案,則按照該方案分配 3.如果同意該方案的人數 包括提出者 小於等於半數,則提出者要被扔到海浬餵魚,剩餘海盜繼續商議分配 4.海盜們是絕對理性的,以自己盡可能獲得...

海盜分金幣問題

另外乙個很有趣的問題 話說一天有5個海盜搶了一艘who的遊輪,搶到了100枚金幣,但這5個人沒有老大,不知道怎麼分這100枚金幣。不過5個人都絕頂聰明,他們決定 1,抽籤,決定12345五個號碼,2,由1號提分配方案,大家一起舉手表決,超過半數同意則通過 否則被扔進大海浬喂鯊魚 3,1號死了由2號提...