比賽 小奔的方案 solution

2022-04-06 03:25:50 字數 2532 閱讀 4022

有乙個著名的題目:

五個海盜搶到了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 這個問題主要是針對...