Problem 1190 Ride to School .
题意
有个空虚寂寞的学生C,他骑车的时候如果能有人一起,就按同行者的速度骑,没有人就等到有人为止。在万柳到燕园(4.5km)的路上,如果有人超过了他们,C就会跳票去跟速度更快的那个人。 C在0时刻到达万柳 若干组输入数据: 骑手人数N (1 <= N <= 10000),N=0结束输入 Vi(km/h),Ti(s),i号骑手的速度,i号骑手出发的时间 输出: C的到达时间(向上取整)
思路
C总是跟着骑得快的那个 = C是和骑得最快的那个并列到达终点的 = C到达终点的时间为第一个骑手到达终点的时间 C肯定不会跟着在负数时刻出发的骑手一起到达终点: 如果这个骑手速度最快,C跟着别人肯定不会追上他。如果这个骑手不是最快的,C只可能在跟着比他先到达终点的骑手时超过他。 对每个骑手分别计算他们到达终点的时间,C的到达时间取最小 由 h = 4.5/Vi,s = h×3600,t_arrive = s + Ti(到达时间=骑行用时+出发时间) 得 t_arrive = 4.5/Vi×3600 + Ti
笔记
#include <math.h>
ceil ( double ) ;
floor ( double ) ;
注意这两的返回值不是int 类型的
代码
#include <cstdio>
#include <math.h>
using namespace std;
int main ( ) {
int n, v, t;
double min_t, t_arrive;
scanf ( "%d" , & n) ;
while ( n!= 0 ) {
min_t = 100000 ;
for ( int i= 0 ; i< n; i++ ) {
scanf ( "%d%d" , & v, & t) ;
if ( t< 0 )
continue ;
t_arrive = 4.5 / v* 3600.0 + t;
if ( t_arrive< min_t)
min_t = t_arrive;
}
printf ( "%d\n" , ( int ) ceil ( min_t) ) ;
scanf ( "%d" , & n) ;
}
return 0 ;
}