一本通贪心经典:1227:Ride to Office

该博客讨论了一种竞赛追赶问题的解决方案,利用贪心算法。题目要求找到最快达到4500米终点的策略,当选手C被速度更快且后出发的人赶上时,会选择与其一起到达。算法核心在于每次在线读入数据后,判断如果与这个人一起到达终点是否能减少时间,选取最短时间。代码中通过转换速度单位并计算到达时间,找出最小时间。博客强调了宏观思维和贪心策略在解题中的应用,并建议选手们在解题后进行总结和提升视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.题目大意

每次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超车的人没有必要,所以把目光聚焦到那些后出发的跑得快的自行车身上,进行去最大值的决策

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值