Тема 26. Обработка целочисленной информации с использованием сортировки

26.08 Составление расписания (конференц залы, аэропорты)

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#63977

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

Входные данные: В первой строке входного файла находятся два числа через пробел: число A - общая продолжительность рабочего дня аэропорта (натуральное число, не превышающее 109  ) и число B - количество запланированных рейсов (натуральное число, не превышающее 10 000). В следующих B строках находится по два числа через пробел. Первое число - время вылета рейса (натуральное число, не превышающее 109  ). Второе число - время прилета (натуральное число, не превышающее 109  ).

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

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

Вложения к задаче
Показать ответ и решение

Решение (Excel/LibreOffice)

Откроем файл в электронной таблице, переместим в другое место первое строку и воспользуемся настраиваемой сортировкой. Отсортируем данные следующим образом: Столбец В по возрастанию и столбец А по возрастанию. Удалим пары чисел, в которых хотя бы одно число больше 9000, такие рейсы мы не сможем осуществить, так как они будут совершены не в рабочее время. После того как удалили ненужные рейсы в ячейку 1  запишем значение 1  , а в ячейку C2  запишем следующую формулу:

=ЕСЛИ(A2>=C1;B2;C1)

С помощью данной формулы мы будем получать время прилета последнего совершенного рейса в намем расписании. Протянем формулу до конца таблицы. В ячейку D1  запишем 1, а в ячейку D2  запишем следующую формулу:

=ЕСЛИ(C2<>C1;D1+1;D1)

Проверяем, что если изменилось время прилета последнего совершенного рейса, то есть добавили новый рейс в наше расписании, то добавляем 1 к счётчику совершенных рейсов. Протянем формулу до конца таблицы. Выделим столбец D и посмотрим максимальное значение - оно равно 63, это и есть первый ответ. Посмотрим время прилета 62-ого рейса. Оно равно 8893. В столбце Е для всех рейсов, у которых в столбце D указано 63, запишем следующую формулу:

=ЕСЛИ(A2492>8893;A2492;)

С помощью этой формулы определим минимальное время вылета 63-ого рейса в нашем расписании. Он равен 8911. Полный ответ: 63 8911.

Решение (Python)

with open(’26_5__1vv34.txt’) as f:
    # a - общая продолжительность рабочего дня аэропорта
    # b - количество запланированных рейсов
    a, b = map(int, f.readline().split())
    pol = [list(map(int, f.readline().split())) for _ in range(b)]

# Для оптимального составления расписания, в котором можно обеспечить макс. количество вылетов,
# сортируем список так, чтобы время прилета шло по возрастанию для раннего прилёта самолётов
pol.sort(key=lambda x: (x[1], x[0]))
count = [pol[0]]
for fl in pol:
    # Если при сопоставлении времени вылета текущего самолёта и прилёта предыдущего всё устраивает,
    # то добавляем самолёт в список
    if fl[0] >= count[-1][1] and a >= fl[1]:
        count.append(fl)

# Найдём последний самолёт с минимальным временем взлёта
mn = 10_000
for fl in pol:
    if fl[0] >= count[-2][1] and a >= fl[1]:
        mn = min(mn, fl[0])

# Выводим кол-во удавшихся рейсов и время вылета последнего рейса
print(len(count), mn)

Ответ: 63 8911

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!