1 条题解
-
0
题目分析
本题属于动态规划问题,需要通过计算两站之间的最短路径来求解最低费用。关键在于如何利用票价分段规则,通过动态规划找到最优解。
解题思路
- 输入处理:读取票价分段标准、车站数量、起始站和终点站,以及各站到起点的距离。
- 动态规划:使用动态规划数组表示到达第站的最低费用,初始时,其余为。
- 状态转移:对于每个车站,向前查找满足距离不超过的所有车站,根据距离计算票价,并更新的最小值。
- 结果输出:即为所求的最低费用。
实现步骤
- 读取输入:解析票价标准、车站信息。
- 初始化动态规划数组:设置起点费用为,其他为最大值。
- 动态规划计算:遍历每个车站,更新可能的最低费用。
- 输出结果:打印终点站的最低费用。
C++实现
#include <iostream> #include <vector> #include <climits> using namespace std; typedef long long LL; int main() { LL L1, L2, L3, C1, C2, C3; cin >> L1 >> L2 >> L3 >> C1 >> C2 >> C3; int N; cin >> N; int start, end; cin >> start >> end; if (start > end) { swap(start, end); } vector<LL> distances(N + 1); distances[1] = 0; // 第1站到第1站的距离为0 for (int i = 2; i <= N; ++i) { cin >> distances[i]; } vector<LL> dp(N + 1, LLONG_MAX); dp[start] = 0; for (int i = start; i < end; ++i) { if (dp[i] == LLONG_MAX) continue; for (int j = i + 1; j <= end; ++j) { LL dist = distances[j] - distances[i]; if (dist <= 0) continue; LL cost; if (dist > 0 && dist <= L1) { cost = C1; } else if (dist <= L2) { cost = C2; } else if (dist <= L3) { cost = C3; } else { // 距离超过L3,无法直达,跳过 continue; } if (dp[j] > dp[i] + cost) { dp[j] = dp[i] + cost; } } } cout << dp[end] << endl; return 0; }
- 1
信息
- ID
- 1356
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 1
- 上传者