1 条题解
-
0
思路与算法
速度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