Ride to School POJ - 1922(思路很重要)

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;
    }
发布了54 篇原创文章 · 获赞 43 · 访问量 1957

猜你喜欢

转载自blog.csdn.net/Jungle_st/article/details/104655658