一本通-1227: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
#include <bits/stdc++.h>
using namespace std;
const double length = 4.5;
const double EPS = 1e-6;
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
double velocity, startTime;
while ((cin >> n) && n){
int res = INT_MAX;
for (int i = 0; i < n; ++i) {
cin >> velocity >> startTime;
if (startTime < -EPS) continue;
int cost = ceil(startTime + length / velocity * 3600);
res = min(res, cost);
}
cout << res << endl;
}
return 0;
}
如果t < 0
,那么这个数据是无用的,因为如果后续这个人的速度大于了先出发的这个人的速度,即使后面相遇,速度也不会减慢,如果后续速度小于先出发的人的速度,后续也不会相遇,所以小于0的数据是无效的。
虽然Charley的速度一直在改变,但是与他相遇的没个人的速度是不会改变的,并且每个人都会达到终点,所以在所有到达终点的人里面,时间最少的就是Charley所需要的时间。