一个铁路线上有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的最少票价。你能做到吗?
输入
输入文件的第一行为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。
输出
输出文件中只有一个数字,表示从A到B要花费的最小值.
输入样例:
3 6 8 20 30 40
7
2 6
3
7
8
13
15
23
输出样例:
70
题解:dp[i]=dp[j]+cost(i,j)
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; const int N=10010; int L1, L2, L3, C1, C2, C3; int n, A, B, dp[N], L[N]; int main() { scanf( "%d%d%d", &L1, &L2, &L3 ); scanf( "%d%d%d", &C1, &C2, &C3 ); scanf( "%d%d%d", &n, &A, &B ); for( int i=2; i<=n; i++ ) scanf( "%d", &L[i] ); memset( dp, 0x7f, sizeof dp ); dp[A]=0;//注意要清成0x7f7f7f7f7,0x3f3f3f3f要wa for(int i=A; i<=B; i++ ) { for(int j=i-1; j>=A && L[i]-L[j]<=L3; j-- ) { int dis=L[i]-L[j]; if( dis<=L1 ) dp[i]=min( dp[i], dp[j]+C1 ); else if( dis<=L2 ) dp[i]=min( dp[i], dp[j]+C2 ); else if( dis<=L3 ) dp[i]=min( dp[i], dp[j]+C3 ); } } printf( "%d\n", dp[B] ); return 0; }
[BZOJ1511]火车票
最新推荐文章于 2019-01-18 21:26:00 发布