zoukankan      html  css  js  c++  java
  • codevs 1349 板猪的火车票

    1349 板猪的火车票

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
    题目描述 Description

    奸商zn(请勿对号入座)开办了一家火车公司,弱弱的板猪要去看望她的朋友小板猪,万恶的zn对板猪实施各种提高价,板猪不寒而栗。。。

    铁路线上有n(2<=n<=10000)个火车站,每个火车站到该线路的首发火车站距离都是已知的。任意两站之间的票价如下表所示:

    站之间的距离 - X      票价

    0<X<=L1       C1

    L1<X<=L2          C2

    L2<X<=L3          C3

    其中L1,L2,L3,C1,C2,C3都是已知的正整数,且(1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9)。显然若两站之间的距离大于L3,那么从一站到另一站至少要买两张票。注意:每一张票在使用时只能从一站开始到另一站结束。

    现在板猪要从A到B,为了不让奸商zn敲竹杠,你能帮助板猪吗?

    输入描述 Input Description

    输入文件的第一行为6个整数, L1, L2, L3, C1, C2, C3 (1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9) ,这些整数由空格隔开.第二行为火车站的数量N (2 <= N <= 10000).第三行为两个不同的整数A、B,由空格隔开。接下来的 N-1 行包含从第一站到其他站之间的距离.这些距离按照增长的顺序被设置为不同的正整数。相邻两站之间的距离不超过L3. 两个给定火车站之间行程花费的最小值不超过10^9,而且任意两站之间距离不超过 10^9。

    输出描述 Output Description

       输出文件中只有一个数字,表示从A到B要花费的最小值.

    样例输入 Sample Input

    3 6 8 20 30 40

    7

    2 6

    3

    7

    8

    13

    15

    23

    样例输出 Sample Output

    70

     1 /*基本思路:序列性DP 
     2 f[i]数组储存着从A到i的最小花费,它是由它之前的站点中可以用一张票坐过来的,以此更新*/
     3 #include<cstdio>
     4 #include<iostream>
     5 #include<cstring>
     6 using namespace std;
     7 #define N 10001
     8 int l[4],c[4],n,A,B;
     9 long long int sum[N],f[N];
    10 void input()
    11 {
    12     for(int i=1;i<=3;++i)
    13     scanf("%d",&l[i]);
    14     for(int i=1;i<=3;++i)
    15     scanf("%d",&c[i]);
    16     scanf("%d",&n);
    17     sum[1]=0;
    18     scanf("%d%d",&A,&B);
    19     for(int i=2;i<=n;++i)
    20     scanf("%d",&sum[i]);
    21 }
    22 int judge(int a,int b)
    23 {
    24     int cha=a-b;
    25     if(a-b<=l[1]) return 1;/*让从t--i选取价格尽量低的票*/
    26     if(a-b<=l[2]) return 2;/*一二三是判断买那张票*/
    27     if(a-b<=l[3]) return 3;
    28     return 0;
    29 }
    30 void DP()
    31 {
    32     memset(f,127,sizeof(f));
    33     f[A]=0;
    34     int flag=0;
    35     for(int i=A+1;i<=B;++i)
    36       for(int t=A;t<=i-1;++t)
    37       {
    38           flag=judge(sum[i],sum[t]);/*判读买那张票*/
    39         if(!flag) continue;/*不能一次到达*/
    40         f[i]=min(f[i],f[t]+c[flag]);/*否则的话更新f[i]的最小数*/
    41       }
    42 }
    43 int main()
    44 {
    45     input();
    46     DP();
    47     cout<<f[B];
    48     return 0;
    49  } 
    View Code
  • 相关阅读:
    ::before和::after伪元素的用法
    JS中map、some、every、filter方法
    C++多线程,互斥,同步
    RAII
    Proxy 代理
    Decorator 装饰
    TCP和UDP的9个区别是什么
    谈谈自己对面向对象的理解
    C++11多线程
    std::move
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5313388.html
Copyright © 2011-2022 走看看