问题描述
Car fueling problem: 已知一辆汽车在加满油的情况下能够开400KM。当前有一个人想要自驾从城市A到城市B(两个城市之间的距离为900KM),途中会经过几个加油站(stop1-stop4),各加油站距起点的位置是已知的,那么这个人要从A市到B市最少应该加几次油?
已经知道的条件有:
1. A到B的距离为:900KM
2. 加满一箱油可跑:400KM
3. 每个加油站距离A的距离(数组):[200,375,550,750]
解题思路:
- 找A到B最少需要加油几次:
- 从A出发
- 找到从A出发能够到达的最远的加油站G,那么G就是必须要加油的加油站
- 加油后,以G作为新起点开始出发,因此G就是new A
- 找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))