【题解】Ride to Office
【题目描述】
起点与终点相隔4500米。现Charley 需要从起点骑车到终点。但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑。而当他遇到以更快的速度骑车的人时,他会以相应的速度跟上这个更快的人。先给定所有与Charley 同路的人各自的速度与出发时间,问Charley 以这种方式跟人,骑完4500米需要多少时间。得出的结果若是小数,则向上取整。
【输入描述】
输入若干组数据,每组数据第一行n(1≤n≤10000),n为0,表示输入结束,接着输入n行数据,每行2个数据,表示速度v和出发时间t,如果t<0,表示陪伴人提早出发了。
【输出描述】
输出对应若干行数据,每行输出1个数,表示最快到达的时间。
【样例输入】
4 20 0 25 -155 27 190 30 240 2 21 0 22 34 0
【样例输出】
780 771
【题目分析】
题目比较坑的一点是速度的单位问题,常见的速度单位是m/s或者是km/h
如果 Charley 的速度是 20 m/s,则骑行 4500 米所需时间为 225 秒,与样例输出不符。
如果 Charley 的速度是 20 km/h(约 5.556 m/s),则骑行 4500 米所需时间约为 810 秒,接近样例输出
所以要进行相应的转换,
基于贪心思路:
理解题意:
Charley 需要从起点骑车到终点,距离为4500米。
他需要有人陪伴,且会跟随速度更快的人。
给定n个陪伴者的速度和出发时间,计算Charley完成4500米所需的时间。
关键点:
Charley的速度会跟随最快的人。
陪伴者的出发时间可能早于或晚于Charley的出发时间。
计算Charley到达终点的时间,需要考虑所有陪伴者的影响。
算法步骤:
对于每个陪伴者,计算他们到达终点的时间。
Charley的到达时间取决于最快陪伴者的到达时间。
遍历所有陪伴者,找到最快到达时间。
【参考答案】
#include <iostream> #include <cmath> using namespace std; int main() { int n; while (cin >> n && n != 0) { int minTime = 1e9; for (int i = 0; i < n; ++i) { int v, t; cin >> v >> t; if (v <= 0) continue; // 速度必须大于0 // 计算到达时间 if(t>=0){ double time = ceil((4.5/v*3600) +t); //注意速度单位 if (time < minTime) { minTime = time; } } } cout << minTime << endl; } return 0; }