Алгоритм расписания встречи - PullRequest
1 голос
/ 21 апреля 2020

Итак, я работаю над оценкой кода практики, и у меня возник вопрос:

Вопрос. Владелец стартапа ищет новых инвесторов, чтобы получить средства для своей компании. У каждого инвестора жесткий график, который владелец должен соблюдать. Учитывая графики дней, в которые инвесторы доступны, определите, сколько встреч владелец может запланировать. Обратите внимание, что владелец может проводить только одно собрание в день. Расписание состоит из двух целочисленных массивов: firstDay и lastDay. Каждый элемент в массиве firstDay представляет первый день, в который инвестор доступен, и каждый элемент в lastDay представляет последний день, в который инвестор доступен, включая оба.

Пример ввода:

STDIN     Function
------    --------
5         firstDay[] size n = 5
1    →    firstDay = [1, 2, 1, 2, 2]
2
1
2
2
5    →    lastDay[] size n = 5
3    →    lastDay = [3, 2, 1, 3, 3]

** Пример вывода: **

3

Мой код:

def countMeetings(firstDay, lastDay):
    intervals= []
    day_of_meeting = 0
    meetings = 0
    for i,j in zip(firstDay,lastDay):
        intervals.append((i,j))
    intervals = sorted(intervals)
    for start,end in intervals: 
        if end < day_of_meeting:
            continue
        meetings += 1
        day_of_meeting = max(day_of_meeting+1, start)
    return meetings

Мне кое-кто помог получить жадный алгоритм, но он все еще не проходит 9/14 тестовых случаев. Большинство этих неудачных случаев скрыты, поэтому я не могу сказать, как далеко я нахожусь, но те, которые не скрыты, находятся на уровне 1 или менее 1 цели.

Ограничения:

1 <= n <= 10^5
1 <= firstDay[i], lastDay[i] <= 10^5 (Where 0 <= i < n)
firstDay[i] <= lastDay[i] (where 0 <= i < n)

1 Ответ

0 голосов
/ 22 апреля 2020

Мой алгоритм:

  • Сортировка интервалов по дате начала
  • Повторение интервалов от первой даты начала до последней даты начала:
    • Отслеживание группа инвесторов, которые все еще доступны до этой даты
    • среди этих инвесторов, всегда выбирают инвестора с самой ранней датой окончания (все остальные варианты неоптимальны, потому что все остальные инвесторы равны)
    • удалить выбранных инвесторов из набора; обновите набор, если какие-либо инвесторы больше не доступны, добавьте новых инвесторов, которые только что стали доступны в эту дату

Если вы используете очередь с приоритетами (иначе говоря, куча), чтобы отслеживать инвесторам (приоритет будет иметь их конечная дата), все запросы и обновления из / в набор доступных инвесторов будут стоить всего log(N), а общая сложность будет Nlog(N), чего должно быть достаточно, чтобы пройти с N=10^5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...