菊厂8.31第三题
某电动车续航1000km,时速100kmph,从A前往B,然后中途有N个充电站,每个充电站充电固定1h,返回最短耗时,如果不能到达,则返回-1.
0<=D<=1E6,且D%100==0
0<=N<=1E4
输入
第一行:表示甲乙两城距离D;
第二行:沿途充电站个数N;
第三行:每行两个数据,分别表示充电站距离A的距离和充电的排队时间。
输出
最短耗时。
#include <bits/stdc++.h> using namespace std; int main() { double D, N; // 为避免误差,所有数字按double处理 int d, t; int duration = 1000, velocity = 100; cin >> D; cin >> N; vector> station(N, vector(2)); for (int i = 0; i < N; i++) { cin >> station[i][0] >> station[i][1]; } if (D <= duration) { printf("%d\n", D / velocity); return 0; } if (station.empty() || station[0][0] > D) { printf("%d\n", -1); return 0; } sort(station.begin(), station.end(), [](const auto &l, const auto &r){ return l[0] < r[0]; }); // dp[i] 表示到达第i个站最小耗时,把起点和终点也当作站加入 vector dp(N + 1, INT_MAX / 2); dp[0] = 0; for (int i = 1; i <= N; i++) { if (station[i - 1][0] <= duration) { dp[i] = static_cast(station[i - 1][0]) / velocity + station[i - 1][1] + 1; continue; } for (int j = i - 1; j >= 1; j--) { if (dp[j] != INT_MAX / 2 && station[i - 1][0] - station[j - 1][0] <= duration) { dp[i] = min(dp[i], dp[j] + static_cast(station[i - 1][0] - station[j - 1][0]) / velocity + station[i - 1][1] + 1); } } } int minHour = INT_MAX / 2; for (int i = 1; i <= N; i++) { if (dp[i] != INT_MAX / 2 && station[i - 1][0] + duration >= D) { minHour = min(minHour, static_cast(dp[i] + (D - station[i - 1][0]) / velocity)); } } if (minHour != INT_MAX / 2) { printf("%d\n", minHour); } else { printf("%d\n", -1); } return 0; }