NOIP2013中秋節模擬 表白 love

2021-08-21 06:48:13 字數 3543 閱讀 3995

雞腿是czyz的著名ds,但是不想追妹子的ds不是好gfs,所以雞腿想通過表白來達到他追到妹子的目的!雖然你對雞腿很無語,但是故事的設定是你幫助雞腿找到了妹子,所以現在你必須幫助雞腿安排表白來實現故事的結局 !

雞腿想到了乙個很高(sha)明(bi)的做法,那就是去找人來組成表白隊伍來增強氣勢 !雞腿有很多好**來幫忙,雞腿數了數一共有n個人。但是雞腿覺得大家排成兩隊來比較好看,而且雞腿經過計算,第一隊n1個人,第二隊n2個人是最佳的隊伍。問題來了…有些好**們雖然很好心但是可能造成不好的影響(形象猥瑣),所以雞腿就給每個人打了分。q1i表示第i個好**排到第一隊裡時的好影響,c1i表示第i個好**排到第一隊裡時的不良影響,q2i表示第i個好**排到第二隊裡時的好影響,c2i表示第i個好**排到第二隊裡時的不良影響。請給雞腿一種安排使得q的和與c的和的比值最大,給出最大值。

input

第一行給出三個整數n、n1、n2。

第2到n+1行,每行四個整數q1,c1,q2,c2。

output

一行輸出乙個小數d表示最優化比例是d(保留6位小數)

sample input

5 2 2

12 5 8 3

9 4 9 4

7 3 16 6

11 5 7 5

18 10 6 3

sample output

2.444444

data constraint

對於50%的資料0 < n1 + n2 ≤ n ≤ 50;

對於100%的資料0 < n1 + n2 ≤ n ≤ 500,1 ≤ q1, q2 ≤ 2000,1 ≤ c1, c2 ≤ 50。

首先對於乙個答案是否合法,我們可以可以可以看 ∑x

∈fir

stgr

oup(

q1i−

c1i∗

k)∑x

∈sec

ondg

roup

(q2i

−c2i

∗k)≥

0 ∑x∈

firs

tgro

up(q

1i−c

1i∗k

)∑x∈

seco

ndgr

oup(

q2i−

c2i∗

k)≥0

那麼我們可以二分乙個答案mid,

然後我們按(q

1i−c

1i∗k

)−(q

2i−c

2i∗k

) (q1

i−c1

i∗k)

−(q2

i−c2

i∗k)

的降序排序,用f[i][j] 表示前i 個人取了j 個進第一隊,用g[i][j] 表示後i 個人取了j 個進第二隊,最後用f[i][n1] +g[n-i][n2]來更新答案即可。

uses

math;

const

eps=1e-8;

var i,j,k,n,m,n1,n2:longint;

q1,c1,q2,c2:array[0..510] of longint;

a,b:array[0..510] of extended;

f,g:array[0..510,0..510] of extended;

l,r,mid:extended;

procedure

qsort

(x,y:longint);

var i,j:longint;

mid:extended;

begin

i:=x;

j:=y;

mid:=a[(x+y) div

2]-b[(x+y) div

2]; repeat

while a[i]-b[i]>mid do inc(i);

while a[j]-b[j]do dec(j);

if i<=j then

begin

a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];

b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];

inc(i);

dec(j);

end;

until i>j;

if ithen qsort(i,y);

if xthen qsort(x,j);

end;

function

pd(x:extended):boolean;

var i,j:longint;

begin

for i:=1

to n do

begin

a[i]:=q1[i]-x*c1[i];

b[i]:=q2[i]-x*c2[i];

end;

qsort(1,n);

fillchar(f,sizeof(f),0);

fillchar(g,sizeof(g),0);

for i:=1

to n do

begin

for j:=1

to min(i,n1) do

begin

f[i,j]:=f[i-1,j-1]+a[i];

if i-1>=j then

f[i,j]:=max(f[i,j],f[i-1,j]);

end;

end;

for i:=n downto1do

begin

for j:=1

to min(n2,n-i+1) do

begin

g[n-i+1,j]:=g[n-i,j-1]+b[i];

if n-i>=j then

g[n-i+1,j]:=max(g[n-i+1,j],g[n-i,j]);

end;

end;

for i:=n1 to n-n2 do

if f[i,n1]+g[n-i,n2]>=0

then

exit(true);

exit(false);

end;

begin

assign(input,'love.in');

reset(input);

assign(output,'love.out');

rewrite(output);

readln(n,n1,n2);

for i:=1

to n do

readln(q1[i],c1[i],q2[i],c2[i]);

l:=0;

r:=2000;

while (l+epsdo

begin

mid:=(l+r)/2;

if pd(mid) then l:=mid

else r:=mid;

end;

//writeln(pd(150.050505));

writeln(l:0:6);

close(input);

close(output);

end.

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOI(P)2013模擬 秘密任務

這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...

NOIP2013模擬 粉刷匠

給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...