题目:
题目描述
在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下: 距离s 票价 0<S<=L1 C1 L1<S<=L2 C2 L2<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 C3 A B N a[2] a[3] …… a[N]
输出描述:
可能有多组测试数据,对于每一组数据, 根据输入,输出乘客从A到B站的最小花费。
代码:
#include<iostream>
#include<vector>
using namespace std;
int L1, L2, L3, C1, C2, C3;
vector<int> justify(vector<int> a,int A,int B) {
vector<int> justified;
int basis = a[A-1];
for (int i = 0; i < a.size(); i++) {
if (i >= A - 1 && i <= B - 1) {
int newn = a[i] - a[A - 1];
justified.push_back(newn);
}
}
return justified;
}
int cost(int S) {
if (S > 0 && S <= L1) {
return C1;
}
if (S > L1&&S <= L2) {
return C2;
}
if (S > L2&&S <= L3) {
return C3;
}
return 0;
}
int min(int a, int b) {
if (a < b)return a;
return b;
}
int main() {
int A, B, N;
while (cin >> L1 >> L2 >> L3 >> C1 >> C2 >> C3 >> A >> B >> N) {
vector<int> stations;
stations.push_back(0);
for (int i = 0; i < N-1; i++) {
int distance;
cin >> distance;
stations.push_back(distance);
}
stations = justify(stations,A,B);
vector<int> d;
d.push_back(0);
for (int i = 1; i < stations.size(); i++) {
d.push_back(0x7fffffff);
for (int j = 0; j < i; j++) {
int dd = stations[i] - stations[j];
if (dd <= L3) {
int temp = d[j] + cost(dd);
d[i] = min(d[i], temp);
}
}
}
cout << d[stations.size() - 1] << endl;
}
return 0;
}