ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Сортировка, отбор и моделирование.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 69920 90893
Решение.
Сохраним приложенный текстовый файл под именем data.txt. Первая строка задаёт параметры задачи; её нельзя считать обычной записью данных. В программе нумерация элементов списка начинается с нуля, а номера из условия сохраняются без сдвига.
В файле 9986 пар «ряд, занятое место». Для каждого ряда соберём множество занятых мест, затем отсортируем его. Повтор одной и той же записи, если он встретится, не должен создавать дополнительное кресло.
Пусть a и b — соседние элементы отсортированного списка занятых мест одного ряда. Между ними находятся ровно b − a − 1 свободных кресел. Нам нужны ровно два: b − a = 3. Тогда свободная пара имеет номера a + 1 и a + 2, а её непосредственные соседи a и a + 3 заняты.
Важно сравнивать именно соседние занятые места: иначе внутри промежутка может находиться ещё одно занятое кресло. У начала или конца списка пара без двух занятых соседей не подходит. Условие на свободные кресла в других рядах здесь отсутствует.
Из найденных вариантов выбираем максимальный номер ряда, а внутри него минимальное a + 1. Перебор всех соседних элементов полон, поскольку у любой требуемой свободной пары два занятых соседа обязательно последовательны в отсортированном списке. Сортировки занимают O(N log N), память O(N).
Полная программа на Python:
from collections import defaultdict
with open("data.txt", encoding="utf-8-sig") as f:
n = int(f.readline())
occupied = defaultdict(set)
for _ in range(n):
r, s = map(int, f.readline().split())
occupied[r].add(s)
best_row = 0
best_seat = 0
for r, seats in occupied.items():
seats = sorted(seats)
for a, b in zip(seats, seats[1:]):
if b - a == 3:
s = a + 1
if r > best_row or (r == best_row and s < best_seat):
best_row, best_seat = r, s
print(best_row, best_seat)Проверка результата.
Найдено 2000 подходящих пар по всему файлу. В выбранном ряду 69920 заняты кресла 90892 и 90895, между ними свободны 90893 и 90894. Разность номеров занятых кресел 90895 − 90892 = 3. Среди подходящих пар этого максимального ряда минимальное левое место равно 90893.
Ответ: 69920 90893.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFBE60AB.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.