雞腿是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個不合法的空的方案數。這裡的空指...