ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Сортировка, отбор и моделирование.
| КЭС: | 3.2 Оценка сложности вычислений. Время работы и объём используемой памяти, их зависимость от размера исходных данных. Оценка асимптотической сложности алгоритмов. Алгоритмы полиномиальной сложности. Переборные алгоритмы. Примеры различных алгоритмов решения одной задачи, которые имеют различную сложность 3.3 Определение возможных результатов работы простейших алгоритмов управления исполнителями и вычислительных алгоритмов. Определение исходных данных, при которых алгоритм может дать требуемый результат 3.4 Алгоритмы обработки натуральных чисел, записанных в позиционных системах счисления: разбиение записи числа на отдельные цифры, нахождение суммы и произведения цифр, нахождение максимальной (минимальной) цифры. Представление числа в виде набора простых сомножителей. Алгоритм быстрого возведения в степень. Поиск простых чисел в заданном диапазоне с помощью алгоритма «решето Эратосфена» 3.5 Многоразрядные целые числа, задачи длинной арифметики |
| Тип ответа: | Краткий ответ |
Ответ: 59966 50449
Решение.
Первая строка файла 107_26.txt содержит N = 18895. Каждая следующая строка задаёт номер ряда и место, где растёт прижившаяся сосна: именно так определены входные данные. Вводная фраза о неприжившихся растениях не меняет смысл записей файла.
Нужно найти ровно 13 подряд свободных мест, непосредственно слева и справа от которых растут сосны. Если две соседние растущие сосны одного ряда имеют номера мест a и b, между ними находится b − a − 1 свободное место. Поэтому необходимое и достаточное условие: b − a − 1 = 13, то есть b − a = 14.
Проверять нужно соседние сосны после сортировки по месту внутри ряда. Тогда между ними гарантированно нет ещё одной сосны. Разность больше 14 не подходит: свободных мест было бы больше 13, и у выбранного внутреннего отрезка не оказалось бы сосен сразу по обеим сторонам.
Сортируем записи сначала по убыванию номера ряда, затем по возрастанию номера места. Первая найденная соседняя пара с разностью мест 14 автоматически даёт наибольший подходящий ряд и наименьшее начало свободного участка в нём. Разные ряды между собой не сравниваем.
Программа на Python 3:
with open('107_26.txt', encoding='utf-8-sig') as source:
n = int(source.readline())
trees = [tuple(map(int, line.split())) for line in source]
assert len(trees) == n
trees.sort(key=lambda item: (-item[0], item[1]))
for index in range(1, n):
previous_row, previous_place = trees[index - 1]
row, place = trees[index]
if row == previous_row and place - previous_place == 14:
print(row, previous_place + 1)
breakПрограмма выводит 59966 50449. Контроль найденного промежутка:
| Показатель | Значение |
|---|---|
| Номер ряда | 59966 |
| Сосна слева | 50448 |
| Первое свободное место | 50449 |
| Последнее свободное место | 50461 |
| Сосна справа | 50462 |
Проверка: 50462 − 50448 − 1 = 13. В файле есть обе граничные сосны, а места от 50449 до 50461 в этом ряду отсутствуют. Полный независимый просмотр всех рядов подтверждает, что в рядах с номером больше 59966 подходящих участков нет, а в найденном ряду раньше места 50449 подходящий участок не начинается.
В примере из условия искали 3 места и получили 50 69. Для основного файла требуется 13 мест, поэтому разность соседних номеров равна 14, а не 4.
Сортировка занимает O(N log N), просмотр соседних записей — O(N). Для списка записей требуется O(N) памяти.
Ответ: 59966 50449.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF5AF3A3.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.