1 条题解

  • 0
    @ 2026-10-27 13:36:01

    思路与算法

    速度v千米/小时走4500米需要16200/v秒。对出发时间t≥0的每个人,计算其独自行驶到终点的时刻t+16200/v,答案是其中最小值再向上取整。t为整数,可直接用t+(16200+v-1)/v(整数除法)计算其向上取整时刻,取最小。若没有t≥0的人,输出-1。

    正确性说明

    Charley最后与某个陪伴者同速到终点,因此他的到达时刻等于该人的直线路程完成时刻,不会早于所有可初始或后续有效陪伴者到达时刻的最小值。负出发的更快者在0时已领先且此后不会被追上,负出发的较慢者即使被赶上也不会触发提速,所以不会改善答案。再取最早到达的非负出发者r:若Charley已经先到终点,自然不晚于r;否则r从起点追赶过程中,若在其终点时刻前Charley还没到,就必会追上Charley并使其速度至少达到r的速度,从而Charley不晚于r到达。上下界相等,答案正是该最小时刻。向上取整是单调函数,所以可以对各候选先精确取整再取最小。

    复杂度

    每组n人,一次扫描O(n),初始化和输出O(1),额外空间O(1)。多组总时间O(总人数),无需保存骑车者或模拟追赶事件。

    易错点

    只选t≥0的人,但t=0不能排除。答案包含在起点等待时间。4500米对应4.5千米,秒制分子是16200;不要用浮点加0.999近似向上取整,整数公式可以避免舍入误差。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        while (cin >> n && n) {
            long long ans = LLONG_MAX;
            for (int i = 0; i < n; i++) {
                long long v, t;
                cin >> v >> t;
                if (t >= 0)
                    ans = min(ans, t + (16200 + v - 1) / v);
            }
            cout << (ans == LLONG_MAX ? -1 : ans) << '\n';
        }
    }
    
    • 1

    信息

    ID
    2124
    时间
    1000ms
    内存
    64MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者