所有車的過橋最短時間

今晚幫朋友助攻遇到了一道題,當時有思路但是沒有寫出來,後來結合牛客網上的解答寫了出來,也不知道具體能AC多少道題,先放在這裏等大家指點吧~

  • 題目描述

有N輛車藥陸續通過一座最大承重爲W的橋,其中第i輛車的重量爲w[i],通過橋的時間爲t[i],要求第i輛車上橋的時間不早於第i-1輛車上橋的時間,任意時刻橋上所有車輛的總重量不超過W。
那麼,所有車輛都通過這座橋所需的最短時間爲多少?

輸入:

第一行爲兩個整數N,W(1<N,W<=100000)
第二行輸入N個整數w[1]到w[N] (1<=w[i]<=W)
第三行輸入N個整數t[1]到t[N]

  • 解題思路
    維護一個上橋的優先隊列curIdx表示當前哪些車輛在橋上,比較的是下車時間。
    如果當前車輛<橋還能承載的重量,車子上橋,車子下橋的時間需要更新爲"已經花費的時間+過橋時間";否則,車子不能上橋,同時讓已經上橋的車下橋,並更新"已經花費的時間"。
def func(N, totalW, W, T):
    if N ==1:
        return T[0]
    sumT, curW = 0, 0  # sumT表示已經花費的時間 curW表示當前橋上承載的重量
    carsIdx = []    # 表示目前橋上承載着的車的索引
    i = 0
    while i < N:
        # 如果重量允許下一輛上車,則更新
        if curW + W[i] <= totalW:
            T[i] += sumT  # 第i輛車的下車時間=已花費的時間+過橋時間
            carsIdx.append(i)
            curW += W[i]
            i += 1
        else:
            tmp = []
            for idx in carsIdx:
                tmp.append(T[idx])
            minT = min(tmp)   # 找出已上橋的車中最早下橋的車,記錄該車下橋的時間
            j = 0
            while j < len(carsIdx):    # 該時刻下橋的車可能不止一輛
                if T[carsIdx[j]] == minT:
                    curW -= W[carsIdx[j]]
                    carsIdx.pop(j)
                else:
                    j += 1
            sumT = minT   # 更新已花費的時間,即爲最早下車時間
    sumT = T[-1]   # 返回最後一輛車下車的時間
    return sumT

if __name__ == '__main__':
    N, totalW = 4, 2
    W = [1, 1, 1, 1]
    T = [2, 1, 2, 2]
    print(func(N, totalW, W, T))

對於例子中的情況,t=0時刻第1輛和第2輛車上橋,t=1時刻第2輛車下橋,同時第3輛車上橋,t=2時刻第1輛車下橋,同時第4輛車上橋,t=3時第3輛車下車,t=4時第4輛車下車。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章