一个铁路线上有n(2<=n<=10000)个火车站,每个火车站到该线路的首发火车站距离都是已知的。任意两站之间的票价如下表所示:
站之间的距离 - X 票价
0<x<=l1
L1<x<=l2
L2<x<=l3
其中L1,L2,L3,C1,C2,C3都是已知的正整数,且(1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9)。显然若两站之间的距离大于L3,那么从一站到另一站至少要买两张票。注意:每一张票在使用时只能从一站开始到另一站结束。现在需要你对于给定的线路,求出从该线路上的站A到站B的最少票价。你能做到吗?
分析
设f[i]表示从起点站(站A)到站i的最少费用。x表示某一站j与站i的间距离。
F[I] = min{f[j] + cost(i,j)} (a <= j < i)
c1 (0<X<=L1)
Cost(i, j) = c2 (L1<X<=L2)
c3 (L2<X<=L3)
∞ (L3<X)
边界:f[a] = 0
var
l1,l2,l3,c1,c2,c3,n,a,b,i,j,x,w:longint;
f,t:array[0..10001]of longint;
begin
readln(l1,l2,l3,c1,c2,c3);
readln(n);
readln(a,b);
for i:=2 to n do
readln(t[i]);
for i:=1 to n do
f[i]:=maxlongint;
f[a]:=0;
t[1]:=0;
for i:=a+1 to b do
for j:=i-1 downto a do
begin
x:=t[i]-t[j];
if x<=l1 then w:=c1 else
if x<=l2 then w:=c2 else
if x<=l3 then w:=c3 else break;
if f[j]+w<f[i] then f[i]:=f[j]+w;
end;
write(f[b]);
end.