【问题标题】:Maximum no of trains that k platform can hold [closed]k平台可以容纳的最大列车数量[关闭]
【发布时间】:2015-04-26 15:23:35
【问题描述】:

给定到达火车站的 N 列火车的到达和离开时间,对于给定的k 站台,返回我们可以在k 站台上容纳的最大列车数量。

k <<< N

到达和离开时间数组

Input:  arr[]  = {9:00,  9:40, 9:50,  11:00, 15:00, 18:00}
        dep[]  = {9:10, 12:00, 11:20, 11:30, 19:00, 20:00}

这个问题是在一些采访中问我的,那么最好的算法是什么?这个问题是从这个问题稍微修改的。

我为这个问题尝试了贪婪算法,但它不适用于所有测试用例。 例如:对于 k=2 我们有时间间隔

arr[]={1:00,1:30,2:00}
dept[]={1:40,2:10,3:30}

' 删除 {1:30 和 2:10 间隔,我们可以为 k=2 完成任务 {1:00-1:40} 和 {2:00-3:30} 因为在此期间没有其他火车发生

【问题讨论】:

  • 你的意思是最小平台数?是什么限制了您拥有无限平台?
  • 我知道如何从这些给定的时间中找到最少的平台,上面的链接也解释了这个解决方案。现在,如果我们只有 k 个站台,那么可以占用这些站台的最大列车数量。
  • 您的意思是“选择给定火车的最大可能子集,使得在任何给定时刻,车站上的火车不超过k”?请澄清问题。
  • 假设我有 15 列火车,而这些火车需要 7 个月台才能顺利运行(没有任何问题)现在假设我们只能负担 4 个月台,所以这些火车的一些火车必须取出。跨度>
  • 我投票结束这个问题,因为它是一个数学作业问题,而不是一个编程问题。

标签: arrays algorithm data-structures dynamic-programming greedy


【解决方案1】:

在我看来(我没有严格的证据)贪婪算法应该有效:

  1. 按发车时间对火车进行排序。

  2. 让我们维护一个大小为k的数组lastDeparture,其中lastDeparture[i]是最后一班火车离开i平台的时间(最初用零填充)。

    李>
  3. 让我们遍历 trains 数组并执行以下操作:

    • 找到lastDeparture[i] &lt;= currentTrain.arrival的所有此类平台。

    • 如果没有此类平台,请继续。

    • 否则,选择lastDeparture值最大的一个(如果有多个这样的平台,我们可以选择其中一个)。

    • 将答案加一,将当前列车加入本站台(即分配lastDeparture[i] = currentTrain.departure

证明的草图:

假设我们的解决方案不是最优的。让我们找到第一列在我们的答案中但不在最佳答案中的火车。应该有其他火车代替它。但它的出发时间更长。因此,当我们交换这两列火车时,总数不会增加。

时间复杂度:O(n log n)(第 3 步可以使用平衡的二叉搜索树有效地处理,使平台按最后出发时间排序)。

【讨论】:

    【解决方案2】:

    我想我之前误解了这个问题。 如果我们的站台数量有限,我现在认为我们会被要求取消最少数量的列车,这样时刻表就不会压垮站台。

    蛮力:

    1. 合并和排序到达和离开(但跟踪哪个是哪个并确定哪个火车到达/离开)。
    2. 遍历数组,每次到达时计数器加一,每次离开时减一。
    3. 如果计数器为 k 并且有火车到达,则取消在“溢出”到达时在站台上离开时间最长的车站的火车。注意:这可能是到达的火车或已经在站台上的火车。
    4. 答案是列车总数减去取消的列车数。

    请注意,通过取消在站台上停留时间最长的列车,我们会取消最少数量的列车。我们必须取消车站的一列火车以释放一个平台,而剩下时间最多的那些有最大的潜力为未来的到达腾出空间。

    如果到达和离开是排序好的并且可以快速合并在一起,那么在最坏的情况下这将是 O(N*K) 复杂度。我注意到给定的示例几乎如此。

    复杂度是排序和 O(N*K) 计数的最坏情况。

    【讨论】:

    • 您似乎没有使用值k。当您不能再在平台上添加火车时,您的算法仍然会计算它。
    • 在这个测试用例上会失败:[a1,a2,a3,d3,a4,d4,a5,d5,...,d1,d2]k=2
    • @amit:我以为我们被要求找到所需数量的平台。我现在认为我们正在取消火车。我已经相应地修改了算法。这是相同的核心思想。在您的示例中,我们取消了在站台上停留时间最长的 2 号列车。
    【解决方案3】:

    如果我正确理解了这个问题,我相信这可以通过使用大小为kstack 来完成,该k 将包含当前在平台上的火车。每列火车(按出发时间排序):

    while current.ArrivalTime > stack.Last.DepartureTime:
      remove the top element (train) from the stack
    push the current train IF there is room, else ignore it
    answer = max(answer, stack.Size)
    

    您的堆栈达到的最大大小将是问题的答案。

    这应该是O(n log n),因为每列火车最多进入/离开堆栈一次。

    【讨论】:

    • 我很确定堆栈结构没有帮助。例如。 (0,2), (1,3)....(到达时间,离开时间)
    • @ElKamina - 我不明白那个例子:我的算法将返回 2(如果 k = 1,则返回 1),这是正确的答案:当 (1, 3) 到达时,你'必须将其放在与 (0, 2) 不同的平台上。如果您没有足够的站台,您将不得不取消火车。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2010-11-26
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多