一.题目大意
每次C追上或者被追上,都会选择是否变速,又由于要求最快到达那么一定是被赶上
被赶上的条件是什么?
一个比C当前速度快的人,比C晚出发,就会被赶上
二.确定算法
于是每次在线读入,一旦满足上述条件,就做一次比较,看和这个人一起到终点和之前一起到终点那个时间短就跟哪个
由于没有询问人的编号,所以不需要记录过程,直接记录最小值
怎么计算到终点的时间,使用宏观上的思维,不去考虑具体的过程,聚焦结果
从C的角度看: 阶段1.被赶上 阶段2.一起走
从那个人的角度看:阶段1.不变速 阶段2.不变速 最终:到达终点
而C从人出发之前t秒出发,然后和人一起到达终点,所需要的时间就是那个人从0秒开始到达终点所需要的时间
三.细节部分
注意题中是4500米,而速度是每小时__公里,所以计算的时候要换算一下
中间过程中速度要使用浮点数便于转换单位,而计算最终的时间使用int就可以,直接强行转化
最后的答案向下取整,不需要其他特殊的操作
四.整体代码
#include <stdio.h>
#include <math.h>
#define MIN 0x3f3f3f3f
int main()
{
int i,n,t,time,min;
double v;
while(scanf("%d",&n) && n)
{
min=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<min)
min=time;
}
}
printf("%d\n",min);
}
return 0;
}
五.总结升华
是不是第一次看见这个部分(笑
当然想要成为一名合格的竞赛选手,就必须做完题之后进行总结,并提升视角高度,重新从上帝视角审视这个问题,这样才能具备宏观思维,对付其他题目的时候不至于呵呵
从这里可以简单的窥见贪心的思想,就是对于所有决策中,那些显然不可能的决策就可以不做,这是对于具体的题目,但如何转化成具体的代码(数学公式)描述呢?就要靠对题目的了解和对题目的数学模型(本质)的抽象够不够到位;当然也有可能是贪心策略找错了
由于是从这道题出发构架贪心的思路体系,所以举一下这道题的例子:这道题中,我们首先发现那些笨鸟先飞有跑的飞快的人我们追不上,又发现被C超车的人没有必要,所以把目光聚焦到那些后出发的跑得快的自行车身上,进行去最大值的决策