Problem
北京大学的许多研究生都住在万柳校区,距主校区盐源4.5公里。万流的学生必须乘公共汽车或骑自行车去学校。由于北京的交通不畅,许多学生选择骑自行车。
我们可以假设除“查理”以外的所有学生都以固定的速度从万柳到盐源。查理(Charley)是一位有着不同骑行习惯的学生,他总是试图跟随另一位骑手,以避免独自骑行。当查理到达万柳的大门时,他会寻找一个出发去盐源的人。如果找到某人,他将跟随该骑手,否则,他将等待某人跟随。在从万流到盐源的途中,如果有任何更快的学生超过查理,他都会离开他追随的骑手,并加快追随更快的骑手的步伐。
我们假设查理到达万柳之门的时间为零。考虑到其他学生的出发时间和速度,您的任务是给查理到达盐源的时间。
Input
有几个测试用例。每种情况的第一行是N(1 <= N <= 10000),代表骑手人数(不包括Charley)。N = 0结束输入。以下N行是N个不同骑手的信息,格式为:
Vi [TAB] Ti
Vi是一个正整数<= 40,指示第i个骑手的速度(每小时公里)。Ti是第i个车手的出发时间,它是一个整数,以秒为单位。无论如何,可以确保始终存在非负的Ti。
Output
每种情况输出一行:Charley的到达时间。处理小数时,取上限。
Sample Input
4
20 0
25 -155
27 190
30 240
2
21 0
22 34
0
Sample Output
780
771
Source
https://vjudge.net/problem/POJ-1922
分析
“他” = “Charley”
1.他只会在共同的位置跟随比他快的同学中最快的同学
,其实不用想那么麻烦,因为他一定和某位童鞋一起抵达
,所以找到这位童鞋即可
2.题目交代一定有起步时间为正的同学,那么为负的忽略就好,因为追不追得上都不是我们要找的童鞋
3.这位童鞋是起步时间为正的同学里最早到达的,因为他俩起步时间不一定相同,故 T他 + 0 = T童鞋 + T童鞋起步
4.单位换算要注意,时间单位s,路程km,速度km/s 所求时间s
5.补充函数:
ceil(t)返回不小于t的最小整数 floor函数;floor(t)表示求不大于t的最大整数
这里只附核心代码
int n, v, t;
while(cin >> n && n) {
double ans = INF;
for(int i = 0; i < n; i++) {
cin >> v >> t;
if(t < 0) continue;
double tmp = t + 16200.0/v; //16200.0 = 3600*4.5
if(tmp < ans) ans = tmp;
}
cout << ceil(ans) << endl;
}