[Algorithmic Toolbox学习笔记][week3]汽车加油问题

问题描述

Car fueling problem: 已知一辆汽车在加满油的情况下能够开400KM。当前有一个人想要自驾从城市A到城市B(两个城市之间的距离为900KM),途中会经过几个加油站(stop1-stop4),各加油站距起点的位置是已知的,那么这个人要从A市到B市最少应该加几次油?

 已经知道的条件有:

1. A到B的距离为:900KM
2. 加满一箱油可跑:400KM
3. 每个加油站距离A的距离(数组):[200,375,550,750]

解题思路:

  1. 找A到B最少需要加油几次:
    1. 从A出发
    2. 找到从A出发能够到达的最远的加油站G,那么G就是必须要加油的加油站
    3. 加油后,以G作为新起点开始出发,因此G就是new A
    4. 找new A到B最少需要加几次油

如何去找最远的加油站?

起始位置为0
0到加油站1的距离为:200(200<=400),可以到达
0到加油站2的距离为:375(375<=400),可以到达
0到加油站3的距离为:550(550>400),无法到达,因此必须在加油站2进行加油

加油完成后,新的起始位置就变成了375:
375到加油站3的距离为:175(175<=400),可以到达
375到加油站4的距离为:375(375<=400),可以到达
375到城市B的距离为:575(575>400),无法到达,因此必须在加油站4加油

如果我们通过for循环来实现的话:

for i in range(0, len(stops))
如果stops[i] - 起始位置 > 一箱油能够行驶的距离
那么stop[i-1]就是我们要找的加油站

如果我们通过while循环来实现的话

如果我们每次判断了一个加油站后就把这个加油站从列表中删除,那么我们只需要每次都判断stop[0] - 起始距离 <= 一箱油能够行驶的距离

如果上面的判断成立,那么就执行while循环内的内容;如果否,那么循环中的内容将不会被执行(同时表示上次的stop[0]是需要加油的地方,且上次的stop[0]是我们的新起点):

-->执行while循环-->200 - 0 = 200 (200 < 400)-->此时的新起点为200
-->继续执行while循环-->375 - 0 = 375 (375 < 400) -->此时的新起点为375
-->继续执行while循环-->550 - 0 = 550 (550 > 400) -->不会执行循环内的内容-->此时的起始点的位置仍然为375。然后继续以375为起点重新进行以上操作。


Implementation

in Python3 (while循环)

def refills(location, distance, tank, stops):
    if tank + location >= distance:
        return 0

    if len(stops) == 0 or (stops[0] - location) > tank:
        return -1

    while len(stops) > 0 and stops[0] - location <= tank:
        newLocation = stops[0]
        stops.pop(0)

    return 1 + refills(newLocation, distance, tank, stops)

distance = 950
tank = 400
stops = [200, 375, 550, 750]
print('count: ', refills(0, distance, tank, stops))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值