问题定义
Gekko教授计划使用直排轮滑从明尼苏达州东部边境的大福克斯市出发,横穿北达科他州,抵达靠近蒙大拿州西部边境的威利斯顿市。他计划携带两公升水,并希望在喝光水之前能滑行m英里。北达科他州官方地图显示了U.S.2号公路上所有可以补充水的地点,以及这些地点间的距离。教授的目标是最小化横穿途中补充水的次数。
算法设计
要最小化补水的次数,我们首先需要找到每次补充水后能滑行的最远距离,并在此基础上决定何时补充水。此问题本质上是一个单位时间任务调度问题,其中任务表示补充水分,而任务之间的间隔(距离)决定了补水后的滑行距离。为了简化问题,我们可以假定每个地点都能提供足够的水量供教授使用至下一个补水地点。
我们的贪心策略如下:
- 对所有补水地点按照它们之间的距离进行排序。
- 从起始地点开始,依次考虑每个补水地点,并计算到达该地点后剩余的滑行距离。
- 如果剩余滑行距离不足以到达下一个补水地点,则在该地点补水。
- 重复步骤2和3,直到到达目的地。