4

Учитывая время прибытия и выезда из N поездов, которые достигают железнодорожного вокзала, для данных платформ k, верните максимальное количество поездов, которые мы можем разместить на платформах 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} 

Этот вопрос был задан мне в каком-то интервью, так что наилучший алгоритм для этого? Этот вопрос слегка изменен из этого вопроса.

http://www.geeksforgeeks.org/minimum-number-platforms-required-railwaybus-station/ 

Я пробовал жадный алгоритм для этого вопроса, но он не работает для всех тестовых случаев.

+3

Вы имеете в виду минимальное количество платформ? Что ограничивает вас наличием бесконечных платформ? – amit

+0

Я знаю, как найти минимальное количество платформы из этих заданных таймингов, ссылка выше также объясняет это решение. теперь, если у нас есть только k платформа, тогда максимум нет поездов, которые могут занимать эту платформу. – aibotnet

+2

Вы имеете в виду «выбрать максимально возможное подмножество данных поездов, чтобы в любой момент времени на станции не было больше« k' поездов »? Просьба уточнить вопрос. – Gassa

ответ

1

Мне кажется (я не строгое доказательство для него), что жадный алгоритм должен работать:

  1. Сортировка поездов по времени вылета.

  2. Давайте поддерживать массив lastDeparture размера k, где lastDeparture[i] время, когда последний поезд покидает платформу i (первоначально заполненный нулями).

  3. Переберем массива поездов и сделайте следующее:

    • Найти все такие платформы, что lastDeparture[i] <= currentTrain.arrival.

    • Если таких платформ нет, продолжайте использовать.

    • В противном случае выберите тот, который имеет наибольшее значение lastDeparture (если таких платформ несколько, мы можем выбрать любой из них).

    • увеличение ответ на один и добавить текущий поезд к этой платформе (то есть назначить lastDeparture[i] = currentTrain.departure

эскиз доказательства:.

Давайте предположим, что наше решение не оптимальна. Найдем первый поезд, который находится в нашем ответе, но не в оптимальном. Вместо него должен быть какой-то другой поезд, но это время отправления больше. Таким образом, общая сумма не может увеличиться при обмене этих двух поездов

Сложность времени: O(n log n) (шаг 3 можно эффективно обрабатывать, используя сбалансированное двоичное дерево поиска, которое сохраняет платформы, отсортированные по последнему времени отправления).

1

Я думаю, что я ранее неправильно понял вопрос. Если у нас ограниченное количество платформ, я теперь думаю, что нас попросят отменить минимальное количество поездов, чтобы расписание никогда не перегружало платформы.

Грубая сила:

  1. Merge & Сортировать Прибытия и вылеты (но отслеживание, что есть что, и определить, какие прибывает поезд/отходит).
  2. Пройдите через массив, добавив один к стойке для каждого прибытия и вычитая по одному для каждого отправления.
  3. Если счетчик k и поезд прибывает, отмените поезд, который находится на станции с самым длинным временем слева на платформе во время «переполненного» прибытия. NB: Это может быть прибывающий поезд или поезд уже на платформе.
  4. Ответ - общее количество поездов минус количество отмененных поездов.

Обратите внимание, что, отменив поезд на станции с самым длинным оставшимся времени на платформе, мы отменим минимальное количество поездов. Мы должны отменить поезд на станции, чтобы выпустить платформу, а те, у кого больше всего осталось время, имеют максимальный потенциал для свободного места для будущих прибытий.

Это будет сложность O (N * K) в худшем случае, если данные о прибытии и отправлении отсортированы и могут быть быстро скреплены друг с другом. Я заметил, что данный пример почти таков.

Сложность - наихудший случай сортировки и O (N * K) подсчет.

+0

Вы не используете значение 'k'. Когда вы больше не можете добавлять поезда на платформу, ваш алгоритм все равно будет считать это. – IVlad

+0

В этом тестовом случае он потерпит неудачу: '[a1, a2, a3, d3, a4, d4, a5, d5, ..., d1, d2]' с 'k = 2' – amit

+0

@amit: Я думал, что мы были попросив найти необходимое количество платформ. Теперь я думаю, что мы отменяем поезда. Я соответствующим образом внедрил алгоритм. Это та же основная идея. В вашем примере мы отменим поезд 2, у которого осталось самое длинное время на платформе. – Persixty

-1

Если я правильно понимаю проблему, я считаю, что это можно сделать, используя stack размера 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) из-за сортировки, так как каждый поезд входит/выходит из стека не более одного раза.

+1

Я уверен, что структура стека не помогает. Например. (0,2), (1,3) .... (arrivalTime, departureTime) – ElKamina

+0

@ ElKamina - Я не понимаю этого примера: мой алгоритм вернет 2 для него (или 1, если k = 1), что правильный ответ: когда (1, 3) придет, вам придется разместить его на отдельной платформе, чем (0, 2). Если у вас недостаточно платформ, вам придется отменить поезд. – IVlad

Смежные вопросы