讨论 / 请问哪里出了问题?自己找不出来...
857379666 2011-07-11 00:54:00
点我顶贴 收藏 删除
program P495;

var

i,n,m,t:longint;

bu,ru,ave:real;

a,b,r:array[0..52] of longint;

procedure sort(l,rr:longint);

var

i,j,x,y:longint;

begin

i:=l;j:=rr;x:=a[(l+rr)div 2];

repeat

while a[i]<x do i:=i+1;

while a[j]>x do j:=j-1;

if i<=j then

begin

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

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

y:=r[i];r[i]:=r[j];r[j]:=y;

i:=i+1;j:=j-1;

end;

until i>j;

if l<j then sort(l,j);

if i<rr then sort(i,rr);

end;

begin

readln(n); bu:=0; ru:=0;

for i:=1 to n do begin read(a[i]); end;readln;

for i:=1 to n do begin read(r[i]);ru:=ru+r[i]; end;readln;

readln(m);

for i:=1 to n do begin b[i]:=a[i]*r[i];bu:=bu+b[i]; end;

ave:=bu/ru;

sort(1,n);

if ave-m<0.00000005 then begin writeln(ru:0:5); halt; end;

if ave>m then

begin

t:=n;

while ((bu-b[t])/(ru-r[t])>m)and(t>=1) do

begin bu:=bu-b[t]; ru:=ru-r[t]; t:=t-1; end;

if t=0 then begin writeln('0.00000');halt;end;

writeln(ru+((m-bu/ru)*ru)/(a[t]-m):0:5); halt;

end;

if ave<m then

begin

t:=1;

while ((bu-b[t])/(ru-r[t])<m)and(t<=n) do

begin bu:=bu-b[t]; ru:=ru-r[t]; t:=t+1; end;

if t=n then begin writeln('0.00000');halt;end;

writeln(ru+(ru*(m-bu/ru))/(a[t]-m):0:5);

end;

end.

查看更多回复
提交回复