細節:
有兩個城市,a,b。和兩個代表航班起飛時間的陣列。
從 a 到 b 的航班用 表示
array a2b,從 b 到 a 的航班用 表示array b2a。從 a 到 b 和 b 到 a 的航班都需要
100 minutes.Need to take "n" roundtrips兩個城市之間(a -> b and b -> a is ONE round trip).假設你總是取
first flight from a to b然后取earliest available flights.
問題: 回傳您回傳城市a的時間。
例子:
a2b = [109, 500]
b2a = [210, 600]
n = 2(roundtrips we need to take)
解釋:
- 從 a 到 b 取 109,在 109 100 = 209 到達 b
- 從 b 到 a 取 210,到達 210 100 = 310。
- 再次從a到b取500。
- 在 500 100 = 600 到達 b,然后乘坐 600 航班回傳
- 到達 600 100 = 700。
我的代碼:
def flight_time(a2b, b2a, n):
a2b.sort()
b2a.sort()
trips = 0
a_arrival_time = 0
i = j = 0
while trips < n:
b_arrival_time = a2b[i] 100
i = 1
while j < len(b2a):
if (b2a[j] - b_arrival_time) < 0:
j = 1
continue
else:
a_arrival_time = b2a[j] 100
j = 1
trips = 1
break
return a_arrival_time
flight_time(a2b, b2a, n)
該用例的代碼運行良好,但看起來代碼并未處理所有邊緣情況。
例如,IndexError: list index out of range當 n 變大時,我得到了n=6。
請提出更好的方法來解決同樣的問題。
uj5u.com熱心網友回復:
您的代碼正確地檢查了從bj出發的可能,但對于從a出發的航班沒有進行相同的檢查。相反,您的代碼只是假設有一個可能的出發時間。實際上,您應該對兩個方向使用完全相同的邏輯。i
您的問題中沒有定義當任務不可能時演算法應該回傳什么,即在某個時刻不再有航班可以完成行程。我假設在這種情況下應該回傳 -1 的值。
這是一個解決方案,它定義了查找和執行單個航班的功能。然后可以使用它從 a 飛到 b,也可以從 b 飛到 a:
from bisect import bisect_left
def flight_time(a2b, b2a, n):
a2b.sort()
b2a.sort()
def first_flight(timetable, time):
if time == -1: # out of time
return -1
i = bisect_left(timetable, time)
return timetable[i] 100 if i < len(timetable) else -1
time = 0
for _ in range(n): # Number of round trips
time = first_flight(a2b, time)
time = first_flight(b2a, time)
return time
time請注意,當變為 -1時,我沒有費心提早退出。在這種情況下time,在主回圈的剩余迭代中保持 -1。如果你愿意,你可以在主回圈中檢測到這個值并退出它。
其次,我使用了bisect. 這可能會或可能不會使演算法更有效,具體取決于在線性搜索中跳過飛行時間的頻率。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510114.html
