Cod sursa(job #25351)

Utilizator mipsPavel Mircea mips Data 4 martie 2007 12:11:17
Problema Magazin Scor 0
Compilator fpc Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 1.5 kb
var a,b,i,p,m,n,d:longint;
v:array[1..30000] of record min,max:integer; end;
s,j:array[1..30000] of integer;
procedure strategy1(i:integer;sus:boolean);
begin
if sus then
begin
if s[i+1]>s[i]+d+(m+2-v[i+1].min)*2 then
s[i+1]:=s[i]+d+(m+2-v[i+1].min)*2;
if j[i+1]>s[i]+d+m+1 then
j[i+1]:=s[i]+d+m+1;
end
else
begin
if j[i+1]>j[i]+d+v[i+1].max*2 then
j[i+1]:=j[i]+d+v[i+1].max*2;
if s[i+1]>j[i]+d+m+1 then
s[i+1]:=j[i]+d+m+1;
end
end;
procedure strategy2(i:integer;sus:boolean);
begin
if not sus then
begin
if s[i+2]>j[i]+d*4+(m+2)+2*(m+2-v[i+1].min) then
s[i+2]:=j[i]+d*4+(m+2)+2*(m+2-v[i+1].min)
end
else
if j[i+2]>s[i]+d*4+(m+2)+2*(v[i+1].max) then
j[i+2]:=s[i]+d*4+(m+2)+2*(v[i+1].max)
end;
procedure strategy3(i:integer;sus:boolean);
begin
if not sus then
begin
if s[i+2]>j[i]+d*4+(m+2)+2*(v[i+2].max) then
s[i+2]:=j[i]+d*4+(m+2)+2*(v[i+2].max)
end
else
if j[i+2]>s[i]+d*4+(m+2)+2*(m+2-v[i+2].min) then
j[i+2]:=s[i]+d*4+(m+2)+2*(m+2-v[i+2].min);
end;

begin
assign(input,'magazin.in');
reset(input);
readln(p,n,m,d);
for i:=1 to n do
begin
v[i].min:=m+2;
v[i].max:=0;
s[i]:=maxint;
j[i]:=maxint;
end;
j[1]:=0;
s[1]:=m+2;
for i:=1 to p do
begin
readln(a,b);
if v[a].min>b then
v[a].min:=b;
if v[a].max<b then
v[a].max:=b;
end;
for i:=1 to n do
begin
strategy1(i,true);
strategy1(i,false);
strategy2(i,true);
strategy2(i,false);
strategy3(i,true);
strategy3(i,false);
end;
assign(output,'magazin.out');
rewrite(output);
writeln(j[n]);
close(output);
end.