При онлайн-покупке билета на концерт известно, какие места в зале уже заняты. Необходимо купить два билета на такие соседние места в одном ряду, чтобы перед ними все кресла с такими же номерами были свободны, а ряд находился как можно дальше от сцены. Если в этом ряду таких мест несколько, найдите пару с наибольшими номерами. В ответе запишите два целых числа: искомый номер ряда и наибольший номер места в найденной паре. Нумерация рядов и мест ведётся с 1. Гарантируется, что хотя бы одна такая пара в зале есть.
В первой строке входного файла находятся три числа: N — количество занятых мест в зале (целое положительное число, не превышающее 10000), M — количество рядов (целое положительное число, не превышающее 100000) и K — количество мест в каждом ряду (целое положительное число, не превышающее 100000). В следующих N строках находятся пары натуральных чисел: номер ряда и номер места занятого кресла соответственно (первое число не превышает значения M, а второе — K).
Два целых положительных числа: наибольший номер ряда и наибольший номер места в найденной паре кресел.
При таких исходных данных ответом является пара чисел 5 и 8. Условию задачи удовлетворяют места 7 и 8 в ряду 5: перед креслами 7 и 8 нет занятых мест и это последняя из двух возможных пар в этом ряду. В рядах 6 и 7 искомую пару найти нельзя.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение:
Решение на Python — Алексей Кабанов
|
f = open('26_17537.txt') N, M, K = [int(x) for x in f.readline().split()] min_ryad = [M+1]*(K+1) for i in range(N): r, m = [int(x) for x in f.readline().split()] min_ryad[m] = min(min_ryad[m], r) ans1 = 0 for i in range(1, K): ans1 = max(ans1, min(min_ryad[i]-1, min_ryad[i+1]-1)) ans2 = [] for i in range(1, K): if min(min_ryad[i]-1, min_ryad[i+1]-1)==ans1: ans2.append(i+1) print(ans1, max(ans2)) |
Объяснение кода:
- Чтение входных данных:
|
f = open('26_17537.txt') N, M, K = [int(x) for x in f.readline().split()] |
Открываем файл '26_17537.txt'
и читаем первую строку, содержащую три числа: N
(количество занятых мест), M
(количество рядов) и K
(количество мест в каждом ряду).
- Инициализация списка
min_ryad
:
Создаем список min_ryad
длиной K+1
, инициализируя его значением M+1
. Этот список будет хранить минимальные номера рядов для каждого места.
- Заполнение списка
min_ryad
:
|
for i in range(N): r, m = [int(x) for x in f.readline().split()] min_ryad[m] = min(min_ryad[m], r) |
Для каждого из N
занятых мест читаем номер ряда r
и номер места m
. Обновляем значение в списке min_ryad
для места m
минимальным номером ряда.
- Поиск максимального номера ряда:
|
ans1 = 0 for i in range(1, K): ans1 = max(ans1, min(min_ryad[i] - 1, min_ryad[i + 1] - 1)) |
Инициализируем переменную ans1
значением 0. Проходим по всем местам от 1 до K-1
и обновляем ans1
максимальным номером ряда, перед которым оба места i
и i+1
свободны.
- Поиск номеров мест:
|
ans2 = [] for i in range(1, K): if min(min_ryad[i] - 1, min_ryad[i + 1] - 1) == ans1: ans2.append(i + 1) |
Инициализируем список ans2
. Проходим по всем местам от 1 до K-1
и добавляем в ans2
номер места i+1
, если максимальный номер ряда перед этими местами равен ans1
.
- Вывод результата:
Выводим максимальный номер ряда ans1
и максимальный номер места из списка ans2
.
Итог:
Этот код решает задачу нахождения пары соседних кресел в ряду, перед которыми все кресла свободны, а ряд находится как можно дальше от сцены. Используется список min_ryad
для хранения минимальных номеров рядов для каждого места, а затем производится поиск максимального номера ряда и соответствующих номеров мест.
Ответ: 9991 5643