Python 火车站所需的最低站台数量
问题如下: 考虑到所有到达火车站的列车的到达和出发时间,任务是找到火车站所需的最小站台数,这样就不会有列车等待。列车可以在午夜前到达,午夜后到达 我理解传统的问题是如何在没有火车可以在午夜前到达午夜后离开的情况下工作的,因为我看到的许多解决这个问题的方法没有考虑到午夜条件 我的方法是只使用传统的“暴力”方法,但我考虑了午夜前到达、午夜后离开的列车,这种特殊情况称为“交叉”。 我已经用Python编写了以下代码,但我不能完全确定这是否是正确的方法。对于选定的输入,代码正常工作,但是有没有更好/更清晰的方法来解决这个问题而不使用暴力Python 火车站所需的最低站台数量,python,algorithm,greedy,Python,Algorithm,Greedy,问题如下: 考虑到所有到达火车站的列车的到达和出发时间,任务是找到火车站所需的最小站台数,这样就不会有列车等待。列车可以在午夜前到达,午夜后到达 我理解传统的问题是如何在没有火车可以在午夜前到达午夜后离开的情况下工作的,因为我看到的许多解决这个问题的方法没有考虑到午夜条件 我的方法是只使用传统的“暴力”方法,但我考虑了午夜前到达、午夜后离开的列车,这种特殊情况称为“交叉”。 我已经用Python编写了以下代码,但我不能完全确定这是否是正确的方法。对于选定的输入,代码正常工作,但是有没有更好/更清
def findPlatform(arr, dep, n):
# Crossover means a train arrives before midnight and leaves after midnight
i = 0
platmax = 1
while i < n:
platforms = 1
j = i+1
while j < n:
# Crossover
if arr[i] > dep[i]:
# Crossover
if ((arr[i] <= arr[j] and arr[i] >= dep[j]) or (arr[j] <= arr[i] and arr[j] >= dep[i])):
if arr[j] > dep[i]:
platforms += 1
# Not Crossover
else:
if ((arr[i] <= arr[j] and arr[i] >= dep[j]) or (arr[j] <= arr[i] and arr[j] >= dep[i])):
platforms += 1
# Not Crossover
else:
# Crossover
if arr[j] > dep[j]:
if ((arr[i] >= arr[j] and arr[i] >= dep[j]) or (arr[j] >= arr[i] and arr[j] <= dep[i])):
platforms += 1
# Not Crossover
else:
if ((arr[i] >= arr[j] and arr[i] <= dep[j]) or (arr[j] >= arr[i] and arr[j] <= dep[i])):
platforms += 1
j += 1
if platforms > platmax:
platmax = platforms
i += 1
return platmax
# driver code
#arr = [900, 940, 950, 1100, 1500, 1800];
#dep = [910, 1120, 1130, 1200, 1900, 2000];
arr = [200, 240, 300, 420, 430, 455, 950, 1130, 2300, 2330, 2340, 2350]
dep = [300, 400, 450, 500, 530, 540, 1150, 1155, 10, 100, 110, 250]
n = len(arr)
print("Minimum Number of Platforms Required = ",
findPlatform(arr, dep, n))
def findPlatform(arr、dep、n):
#交叉是指列车在午夜前到达,午夜后离开
i=0
platmax=1
而idep[i]:
#交叉
如果((arr[i]=dep[j])或(arr[j]=dep[i]):
如果arr[j]>dep[i]:
平台+=1
#不交叉
其他:
如果((arr[i]=dep[j])或(arr[j]=dep[i]):
平台+=1
#不交叉
其他:
#交叉
如果arr[j]>dep[j]:
如果((arr[i]>=arr[j]和arr[i]>=dep[j])或(arr[j]>=arr[i]和arr[j]=arr[j]和arr[i]=arr[i]和arr[j]platmax:
platmax=平台
i+=1
返回平台
#驱动程序代码
#arr=[900940950110015001800];
#dep=[91011201130、1200、1900、2000];
arr=[20024030042043045595011302300233023402350]
dep=[30040045050053054011501155101001110250]
n=长度(arr)
打印(“所需平台的最小数量=”,
findPlatform(arr、dep、n))
这个问题让我想起了经典的“公共汽车上有10名乘客。在第一站,3名乘客下车,2名乘客上车。在第二站,4名乘客下车,1名乘客上车。在第三站,1名乘客下车,5名乘客上车。公共汽车上有多少乘客?”
这个问题很容易回答,因为您只需对公交车上的乘客数量进行计数,然后迭代事件并调整计数
在您的问题中,不是公交车上的乘客,而是车站里的火车。但这不会改变任何事情。我们可以在24小时内重复事件(火车到达、火车离开),计算车站的列车数量,每次到达时调整+1,每次发车时调整-1。我们还需要计算最大列车数量
我们在“公交车乘客”故事中得到的一个信息是公交车乘客的初始数量。在您的问题中,这转化为“在24小时周期开始时有多少列车在车站”,即有多少列车在午夜之前到达,但在午夜之后离开。这些列车恰好是“晚到”的列车所以我们可以做一个简单的函数来计算这些列车:
def get_nb_train_at_midnight(arr, dep):
return sum(1 for (a,d) in zip(arr,dep) if a > d)
然后我们需要按顺序遍历事件列表,因此让我们构建该列表。事件是一对(时间,类型)
,其中类型
是'arr'
或'dep'
。我们可以将其设置为三元组(时间,类型,id)
如果我们还想跟踪当前在车站的列车,但我们只关心列车的数量,这样我们就可以忘记它们的id。让我们创建一个函数来创建事件列表:
def get_list_of_events(arr, dep):
events = [(t, 'arr') for t in arr] + [(t, 'dep') for t in dep]
events.sort()
return events
注意:我们可以使用关键可选参数来排序,以指定我们要按时间排序,但时间已经是该对中的第一个元素,因此这是自动的。此外,如果我们要使用列车id制作三元组,我们可以编写[(t,'arr',i)for(i,t)in enumerate(arr)]
来获取id
现在我们有了事件列表和初始列车数量,因此我们可以迭代事件列表并跟踪车站的列车数量:
def get_max_nb_trains(events, nb_trains_at_midnight):
nb_trains = nb_trains_at_midnight
max_trains = nb_trains
for (time, type) in events:
nb_trains += (1 if type == 'arr' else -1)
max_trains = max(max_trains, nb_trains)
return max_trains
让我们在python repl中尝试这些函数:
>>> arr = [1,3,7,9,10,10,19,23]
>>> dep = [11,4,11,10,11,2,2,2]
>>> events = get_list_of_events(arr, dep)
>>> nb_trains_midnight = get_nb_train_at_midnight(arr, dep)
>>> events
[(1, 'arr', 0), (2, 'dep', 5), (2, 'dep', 6), (2, 'dep', 7), (3, 'arr', 1), (4, 'dep', 1), (7, 'arr', 2), (9, 'arr', 3), (10, 'arr', 4), (10, 'arr', 5), (10, 'dep', 3), (11, 'dep', 0), (11, 'dep', 2), (11, 'dep', 4), (19, 'arr', 6), (23, 'arr', 7)]
>>> nb_trains_midnight
3
>>> get_max_nb_trains(events, get_nb_train_at_midnight(arr, dep))
5
在本例中,您可以看到我确实在事件列表中包含了列车ID,尽管这些信息并不有用。如果是第二天,是否可以在发车时间上增加24小时?这样您可以使用现有的解决方案PS如果您应该从我的回答中保留一件事,那就是:预处理!这一旦你有了事件的排序列表,“算法”就非常简单。通过直接操作你得到的数组来获得结果
arr
和dep
,这将形成一个更复杂的算法。预处理你的数据,使其形成一个你可以轻松操作的形状,在大多数算法问题中是至关重要的。