zoukankan      html  css  js  c++  java
  • 火车票

    题意

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



  • 相关阅读:
    组合和继承
    解决不了问题
    [zz]shared_ptr 在 stl容器中排序的陷阱
    char ** 初始化
    [zz]c++ list sort方法
    [zz]ZeroMQ的学习和研究
    shared_prt自己使用记录
    rapidxml使用笔记
    HDOJ_ACM_I love sneakers!
    HDOJ_ACM_PiggyBank
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500160.html
Copyright © 2011-2022 走看看