今晚幫朋友助攻遇到了一道題,當時有思路但是沒有寫出來,後來結合牛客網上的解答寫了出來,也不知道具體能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輛車下車。