菊厂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;
}
全部评论
感觉这典型的动态规划题啊
点赞
送花
回复
分享
发布于 2022-09-03 09:49 陕西

相关推荐

点赞 5 评论
分享
牛客网
牛客企业服务