d1,d2,c,rest,need,cost:double;
p,d:array[0..101]of double;
begin
read(d1,c,d2,p[0],n);
d[0]:=0;d[n+1]:=d1;
for i:=1 to n do read(d[i],p[i]);
k:=0;rest:=0;cost:=0;
if d2=0 then begin write(’No Solution’);halt;end;
repeat
j:=k;min1:=0;min2:=0;
while (j<n+1)and(d[j+1]-d[k]<=c*d2) do
begin
inc(j);
if (min1=0)and(p[j]<p[k]) then min1:=j;
if (min2=0)or(p[j]<p[min2]) then min2:=j;
end;
if j=k then begin write(’No Solution’);halt;end;
if min1>0 then
begin
need:=(d[min1]-d[k])/d2;
if need<0 then need:=0;
cost:=cost+p[k]*need;
rest:=0;
k:=min1;
end
else begin
if c*d2<=d[n+1]-d[k] then need:=c*d2-rest
else need:=(d[n+1]-d[k])/d2-rest;
cost:=cost+need*p[k];
rest:=rest+need-(d[min2]-d[k])/d2;
k:=min2;
end;
until k=n+1;
write(cost:0:2);
end.
此程序总是WA一个,为什么呢?
var
d1,d2,c,p,zd,s,y,yy,h,fy,k1,jp:real;
i,j,k,n,m,o:integer;
bo,boo:boolean;
a:array[1..2,0..1000] of real;
b:array[0..1000] of real;
begin
read(d1,c,d2,p,n);
zd:=c*d2;
a[2,0]:=p;y:=0;yy:=0;fy:=0;
a[1,0]:=0;b[0]:=0;m:=1;
if n=0 then
begin
if d1>zd then begin write(’No solution’);halt;end
else write(d1/d2*p:0:2);
end
else
begin
readln;
for i:=1 to n do
begin
readln(a[1,i],a[2,i]);
b[i]:=a[1,i]-a[1,i-1];
end;
b[n+1]:=d1-a[1,n];
for i:=1 to n do
if b[i]>zd then begin write(’No Solution’);halt;end;
bo:=false;
while bo=false do
begin
s:=0;boo:=false;
for i:=m to n+1 do
begin
s:=s+b[i];
if s>zd then break;
end;
i:=i-1;
for j:=m to i do
if a[2,j]<a[2,m-1] then
begin
h:=0;
boo:=true;
for k:=m to j do h:=h+b[k];
y:=h/d2-yy;
fy:=fy+y*a[2,m-1];
m:=j+1;
yy:=0;
break;
end;
if boo=false then
begin
if zd>s then begin writeln(((s/d2-yy)*a[2,m-1]+fy):0:2);halt;end
else begin
k1:=a[2,m];
for j:=m+1 to i do
if k1>a[2,j] then begin o:=j;k1:=a[2,j];jp:=a[1,j]-a[1,m-1];end;
y:=c-yy;
fy:=fy+y*a[2,m-1];
m:=o+1;
yy:=c-jp/d2;
end;
end;
end;
end;
end.