Algorithm for truck moving around a circle of gas stations

前端 未结 11 1389
陌清茗
陌清茗 2020-12-13 07:08

You have a truck moving around a circular track with gas stations spaced out around the circle. Each station has a finite amount of gas. The gas tank on the truck is infinit

11条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-13 07:50

    Let cost be an array of the costs to the next station and gas be an array of how much fuel we can refill

    We calculate the difference between gas[i] and cost[i], called diff, where i is the current gas station we are at.

    If cost[i] > gas[i] (or diff < 0), it means we need to have at least cost[i] - gas[i] fuel when arriving at station i to make it to the next stop, i + 1. If cost[i] <= gas[i] (diff >= 0), it is a valid starting point because we can start without gas, fill up, and head to the next station. At worst, we will reach the next stop with an empty tank. At best, we will have extra fuel left when we reach i+1 (diff > 0)

    We actually don’t have to start from one station, traverse n gas stations successfully to find out whether there is a valid tour! As long as summed fuel >= summed cost, there will be a valid tour. So we just need to do an O(n) pass of the arrays

    More analysis:

    Case1: Tank drops below 0

    This will only happen at a stop where diff < 0. There might be another starting point after that which collects enough excess fuel after traveling one round to pass this station. However, all those stations which we have passed before will not help, so we do not need to consider them (look at case 2 explanation).

    Case 2: Tank currently >=0, but we encounter another valid starting point

    We can safely ignore this because:

    A —— B —— C. If B can reach C, and A can reach B, then A can reach C.

    Case 3: Tank currently >=0, not a valid starting point

    Continue proceeding to the next one

    Case 4: Managed to reach the original starting point!

    Yay!

    def find_starting_station(gas, cost):
        sum_gas = sum_cost = tank = start = 0
    
        for i in range(0, len(gas)):
            sum_gas += gas[i]
            sum_cost += cost[i]
            tank += gas[i] - cost[i]
    
            if tank < 0:
                tank = 0
                start = i+1
    
        if sum_gas < sum_cost: 
            return -1 
    
        return start
    

提交回复
热议问题