[プログラマー]橋を渡るトラック/消防車


問題を整理する
https://programmers.co.kr/learn/courses/30/lessons/42583
橋に乗れるトラックの数bridge_length足の重量weightトラックあたりの重量truck_weightsすべてのトラックに戻るには少なくとも数秒かかるという問題があります.
タイムブリッジを通るトラック待ちトラック0[][7,4,5,6]1~2[][7][4,5,6]3[7][4][4][5][4,5][6][7]6~7[7][4,5][6][6][8][7,4,5,6][7][7][7][7,4,6][6][8][7,4,5,6][][7,4,5][7][7][7][7][7][7][7][7][4,5][][][7][7][7][4,5][7][7
I/O例
bridge_lengthweighttruck_weightsreturn210[7,4,5,6]8100100[10]101100100[10,10,10,10,10,10,10,10,10,10]110
問題を解くを使用してアクセスしました.
周波数は0で表され、道路上の要素が消えるまで増加時間とpopleft()が繰り返される.
この場合、橋の上のトラックの重量と入るトラックの重量の和が耐えられる重量より小さいことを確保し、小さいか等しい場合はトラックを橋に上げ、大きい場合は0appendを合わせてください.
タイムアウト
from collections import deque
def solution(bridge_length, weight, truck_weights):
    time = 0
    truck_weights = deque(truck_weights)
    bridge = deque([0] * bridge_length)
    bridge_weight = 0
    while(bridge):
        time += 1
        bridge.popleft()
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight:
                bridge.append(truck_weights.popleft())
            else:
                bridge.append(0)
    return time 
5番目のテストケースでは、タイムアウトがより良いです.
いずれにしても、橋上トラックの重量を求めるためにsum()を使用しており、時間の複雑さはO(n)で、道路の長さが長くなるとタイムアウトする可能性があります.
従って,sumを用いずに,この問題を解決するために個別の変数bridge_weightを作成した.
最終コード
from collections import deque
def solution(bridge_length, weight, truck_weights):
    time = 0
    truck_weights = deque(truck_weights)
    bridge = deque([0] * bridge_length)
    bridge_weight = 0
    while(bridge):
        time += 1
        bridge_weight -= bridge.popleft()
        if truck_weights:
            if bridge_weight + truck_weights[0] <= weight:
                truck = truck_weights.popleft()
                bridge.append(truck)
                bridge_weight += truck
            else:
                bridge.append(0)
    return time