【算法分析】
样例的输入输出对不上,查了英文原题,发现,题目表述不清:
Vi is a positive integer <= 40, indicating the speed of the i-th rider (kph, kilometers per hour). Ti is the set off time of the i-th rider, which is an integer and counted in seconds. In any case it is assured that there always exists a nonnegative Ti.
速度单位km/h,时间单位s
一.题目大意
每次C追上或者被追上,都会选择是否变速,又由于要求最快到达那么一定是被赶上。被赶上的条件是什么?一个比C当前速度快的人,比C晚出发,就会被赶上。
二.确定算法
于是每次在读入数据,一旦满足上述条件,就做一次比较,看和这个人一起到终点和之前一起到终点那个时间短就跟哪个。由于没有询问人的编号,所以不需要记录过程,直接记录最小值。怎么计算到终点的时间,使用宏观上的思维,不去考虑具体的过程,聚焦结果。
从C的角度看: 阶段1.被赶上 阶段2.一起走
从那个人的角度看:阶段1.不变速 阶段2.不变速 最终:到达终点
而C从人出发之前t秒出发,然后和人一起到达终点,所需要的时间就是那个人从0秒开始到达终点所需要的时间,既t+ceil(4500/(1000.0*v/3600))
三.细节部分
注意题中是4500米,而速度是公里/小时,所以计算的时候要换算一下。中间过程中速度要使用浮点数便于转换单位,而计算最终的时间使用int就可以,直接强制转化最后的答案向上取整。
【代码】
#include <stdio.h>
#include <math.h>
#define MIN 0x3f3f3f3f
int main()
{
int i,n,t,time,minn;
double v;
while(scanf("%d",&n) && n)
{
minn=MIN;
for(i=1;i<=n;i++)
{
scanf("%lf%d",&v,&t);
if(t>=0)
{
time=(int)(t+ceil(4500/(1000.0*v/3600)));
if(time<minn)
minn=time;
}
}
printf("%d\n",minn);
}
return 0;
}