题意
骑自行车,开始时间有负数的,选择开始时间非负数的最早出发的人,一起出发,然后被别人超过时,就追上去,终点距离是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…