火车票

来源:互联网 发布:多玩魔兽数据库 编辑:程序博客网 时间:2024/04/28 23:47
题意

一个铁路线上有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.



0 0
原创粉丝点击