【HDU-1445】Ride to School

101 阅读2分钟
题意

骑自行车,开始时间有负数的,选择开始时间非负数的最早出发的人,一起出发,然后被别人超过时,就追上去,终点距离是4.5km,速度单位是km/s,求到达的时间(s)。

思路

​ 对于出发时间为负数的骑手不用理会,因为Charley还没到的时候单车就走了,如果速度比查理快,查理永远也追不上。速度比查理慢的话,追上了也没影响,因为查理会直接超过他不会选择跟他 ​ 查理最后一定是跟着最早到达的人一块到达终点.因为除了查理每个人都是匀速行驶,包括最早到达的那个人,所以在路上一定是那个人超过了查理然后查理去跟上他。而谁最早到达取决于谁的骑行时间与出发时间的总和最小 ​ 所以,只要某个骑手出发的足够早,速度又足够快,那么查理一定能遇上他,并且查理一定是跟着他到达的终点。 ​ 最简单的做法是:计算所有骑手从出发到到达终点的时间,再加上他们各自的出发时间。总时间最小的那个就是最终答案

​ 如果直接对骑手的速度排序,找一个速度最快的,计算他的全程时间再加上他的出发时间作为最终答案,那么很可能会错误,因为如果这个速度很快的人出发很晚,那么就很有可能在查理遇到他之前查理就已经到终点了 同理,也不能直接找出发世间最早的,因为他的速度可能很慢。所以,要找这两个因素加起来时间最短的

 

 

 

样例
Sample Input
4
20 0
25 -155
27 190
30 240
2
21 0
22 34
0

Sample Output
780
771

 



 

AC代码
#include <iostream>
#include<algorithm>
#include<math.h>
using namespace std;
//一直把题意理解错了!!!   一直以为Ti是查理和每个骑手的相遇时间,这样就把问题想复杂了!

int main()
{

    int n,t[10001],v[10001];
    cin>>n;

    while(n!=0)
    {
        int mixsum=9999999;
        for(int i=0;i<n;i++)
        {
            cin>>v[i]>>t[i];
            if(t[i]<0 || v[i]==0)  
                //当出发时间为负或者速度为0(除零错误)时,略过
                continue;
            int sum=ceil(4.5/v[i]*3600+t[i]);
            //cout<<sum<<endl;
            if(sum<mixsum)
                mixsum=sum;
        }
        cout<<mixsum<<endl;
        cin>>n;
    }
}


 

题源:acm.hdu.edu.cn/showproblem…