問題描述
有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號提...