-
题目描述:
-
在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:距离s 票价0<S<=L1 C1L1<S<=L2 C2L2<S<=L3 C3输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。每两个站之间的距离不超过L3。当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。根据输入,输出乘客从A到B站的最小花费。
-
输入:
-
以如下格式输入数据:L1 L2 L3 C1 C2 C3A BNa[2]a[3]……a[N]
-
输出:
-
可能有多组测试数据,对于每一组数据,根据输入,输出乘客从A到B站的最小花费。
-
样例输入:
-
1 2 3 1 2 3 1 2 2 2
-
样例输出:
-
2
-
需要注意两站之间距离可能为0
-
-
/***** dijkstra解法 *****/ #include <stdio.h> #include <string.h> #define INF 9999999999 long long int L1,L2,L3,C1,C2,C3,A,B,N; long long int G[200][200]; long long int cost(long long int L) { if(L >= 0 && L <= L1) return C1; else if(L <= L2) return C2; else if(L <= L3) return C3; else return INF; } int main() { //freopen("Test.txt","r",stdin); while(scanf("%lld%lld%lld%lld%lld%lld",&L1,&L2,&L3,&C1,&C2,&C3) != EOF) { scanf("%lld%lld",&A,&B); scanf("%lld",&N); if(A == B) { printf("0\n"); continue; } long long int a[1000]; a[1] = 0; int i, j, k; for(i = 2; i <= N; i++) scanf("%lld",&a[i]); for(i = 1; i <= N; i++) { for(j = i; j <= N; j++) { if(i == j) G[i][j] = 0; else G[i][j] = G[j][i] = cost(a[j] - a[i]); } } /* for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) printf("%lld ",G[i][j]); printf("\n"); } */ long long int dist[1000]; int mark[1000]; for(i = 1; i <= N; i++) { dist[i] = G[A][i]; mark[i] = 0; } mark[A] = 1; int newP = A; for(j = 1; j < N; j++) { for(i = 1; i <= N; i++) { if(G[newP][i] == INF) continue; if(mark[i] == 1) continue; if(dist[i] > dist[newP] + G[newP][i]) { dist[i] = dist[newP] + G[newP][i]; } } long long int min = INF; for(i = 1; i <= N; i++) { if(mark[i] == 0 && dist[i] < min) { min = dist[i]; newP = i; } } mark[newP] = 1; //printf("%d\n",newP); } printf("%lld\n",dist[B]); } return 0; }
-
-
/*** DP解法 ***/ #include <stdio.h> long long l1,l2,l3,c1,c2,c3,A,B,N,i,j; long long len1[1000], len[1000], ans[1000]; int main() { //freopen("Test.txt","r",stdin); while(scanf("%lld%lld%lld%lld%lld%lld",&l1,&l2,&l3,&c1,&c2,&c3) != EOF) { scanf("%lld%lld%lld",&A,&B,&N); len1[1] = len[1] = 0; for(i = 2; i <= N; i++) { scanf("%lld",&len1[i]); len[i] = len1[i] - len1[i-1]; } if(A > B) { long long temp = A; A = B; B = temp; } ans[A] = 0; for(i = A+1; i <= B; i++) { long long sum = 0, min = ans[i-1] + c3, tmp; for(j = i-1; j >= A; j--) { sum += len[j+1]; if(sum >= 0 && sum <= l1) tmp = ans[j] + c1; else if(sum > l1 && sum <= l2) tmp = ans[j] + c2; else if(sum > l2 && sum <= l3) tmp = ans[j] + c3; else break; if(tmp < min) min = tmp; } ans[i] = min; } printf("%lld\n",ans[B]); } return 0; }