有乙個著名的題目:
五個海盜搶到了100個金幣,每一顆都一樣的大小和價值連城。
他們決定這麼分:
1.抽籤決定自己的號碼 ------ [1、2、3、4、5]
2.首先,由1號提出分配方案,然後大家5人進行表決,當且僅當不少於半數的人同意時,按照他的提案進行分配,否則將被扔入大海喂鯊魚。
3.如果1號死後,再由2號提出分配方案,然後大家4人進行表決,當且僅當不少於半數的人同意時,按照他的提案進行分配,否則將被扔入大海喂鯊魚。
4.以次類推
每個海盜都是很聰明的人,他們遵循如下原則:
1.保命;
2.如果滿足條件1,那麼想辦法獲得更多的錢;
3.如果滿足條件1,2,那麼想辦法殺更多的人。
那麼最終的分配方案會是怎樣的呢?
答案當然就是98,0,1,0,1。(注意這裡是:不少於半數)
小奔合上書,來到了船頭,突然發現真的有一群海盜!
小奔就這樣被抓住了。。。nn
個海盜把他綁架到了海盜船上,開始準備瓜分他m
m個金幣。
海盜們讓小奔求出:若是n
n個海盜搶到了m
m個金幣,並且要不少於q
q%的人投贊成票,他們會如何分配呢?
請你給出n
n個海盜分m
m個金幣且要不少於q
q%的人投贊成票的解法,並保證結果號碼較小的分到的金幣盡可能的多。
每個數字間用乙個空格隔開,如果結果中某個海盜死了,輸出 −1−
1 代替。
本題可以參考海盜分金模型,倒著考慮,維護當前每個人分得的金幣。可以發現第i個人自己得到的金幣一定是i+1個人的金幣數-1(有些資料不一定),分配的方法跟海盜分金一樣,選出後面人數*q的人(要排序選擇最好討好的人)就可以了(同時維護號碼較小的人所得金幣越多)
#include #include using namespace std;
int a[1001],b[1001],d[1001],f[1001];
int k,n,m,o;
void zx(int p,int q)a
if(p+i-1==q) return;
for(j=p+i;j<=q;++j) a[d[j]]=0;
}void qsort(int l,int r)
}while(!(i>j));
if(l=1;--i)
}for(i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}
var
a,b,c,d,f:array[1..1000]of longint;
i,j,k,n,m,o:longint;
procedure zx(p,q:longint);
var i,j:longint;
begin
i:=0;
while (i/(q-p+1))<(o/100) do
begin
inc(i);
k:=k+b[p+i-1]+1;
if i=1 then dec(k);
a[d[p+i-1]]:=b[p+i-1]+1;
if a[d[p+i-1]]>m then a[d[p+i-1]]:=m;
end;
if (p+i-1)=q then exit;
for j:=p+i to q do a[d[j]]:=0;
end;
procedure qsort(l,r:longint);
var i,j,mid,p,m1:longint;
begin
i:=l;j:=r;
mid:=b[(l+r) div 2];
m1:=d[(l+r) div 2];
repeat
while (b[i]mid)or((b[j]=mid)and(d[j]>m1)) do dec(j);
if (i<=j) then
begin
p:=b[i]; b[i]:=b[j]; b[j]:=p;
p:=d[i]; d[i]:=d[j]; d[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if ln then for j:=n downto i+1 do f[j]:=a[j];
d:=c;
k:=0;
if i<>n then qsort(i+1,n);
fillchar(a,sizeof(a),0);
if i<>n then zx(i,n);
a[i]:=m-k;
if a[i]<0 then
begin
for j:=n downto i+1 do a[j]:=f[j];
a[i]:=-1;
end;
end;
for i:=1 to n do write(a[i],' ');
end.
比賽 大奔的方案solution
此題是小奔的方案的改進。小奔的方案思路 倒推,每次都從小到大排序並且保證小號在前,然後使每乙個人分到的金幣都是上一次加一,直到金幣分完或者自己可以存活 投票率大於等於所需概率 如果不行就 1。即題目背景 大奔的方案無非就是分兩種情況 1.只討好不是自己幫派的,那怕自己幫派成員都投反對票也能活下來。2...
比賽 小奔與不等四邊形solution
有這樣一道經典的數學題 已知乙個四邊形的邊長是四個連續的正整數,求證這個四邊形的面積的最大值不為整數。小奔輕鬆地證明了這個問題,現在問題來了,大奔要求小奔以最快的速度算出給定邊長的四邊形的最大面積,但小奔並不精於程式設計,你能幫幫他嗎?給出四個正整數a,b,c,d,表示四邊形的四邊長,求此四邊形的最...
比賽時的小tips
請看本站的另一篇博文.在那篇博文中測試了各種讀入的時間效率.傳送門 inline int read while ch 0 ch 9 return x p 定義乙個陣列指標在原陣列的中間,對這個指標進行操作 int a 100 b a 50 b 1 1 實際上也就相當於a 49 1 這個問題主要是針對...