В лесополосе осуществляется посадка деревьев. Причем саженцы высаживают рядами на одинаковом расстоянии.
Через какое-то время осуществляется аэросъемка, в результате которой определяется, какие саженцы прижились. Необходимо определить ряд с максимальным номером, в котором есть подряд ровно неприжившихся саженцев, при условии, что справа и слева от них саженцы прижились. При аэросъемке была совершена ошибка — одно и то же дерево могло быть снято дважды. В ответе запишите сначала наибольший номер ряда, затем наименьший номер из найденных
неприжившихся мест в этом ряду.
Входные данные:
В первой строке входного файла находится число — количество занятых мест (натуральное число, не превышающее
). Каждая из следующих
строк содержит два натуральных числа, не превышающих
: номер ряда и номер занятого места.
Выходные данные:
Два целых неотрицательных числа: максимальный номер ряда, где нашлись обозначенные в задаче места, и минимальный номер подходящего места.
Решение (Excel/LibreOffice)
Сначала перенесем данные из файла в Excel, скопировав и вставив с разделителем пробел, а также удалим первую строчку.
Настраиваемой сортировкой отсортируем в первую очередь по столбцу по возрастанию, во вторую — по столбцу
по возрастанию.
Выделим полностью столбцы и
, перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты, в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит деревья, которые были по ошибке сняты дважды).
В LibreOffice Calc необходимо также выделить оба столбца, применить фильтр и перейти в раздел Фильтр по условию -> Стандартный фильтр.
В условиях фильтра необходимо через И выбрать столбцы и
, установить значение Не пусто и поставить галочку напротив Без повторений. После чего нужно скопировать отфильтрованные значения на новый лист и работать уже там.
Чтобы определить, пропущены ли ровно 13 саженцев среди прижившихся, в ячейку запишем формулу и растянем её до конца таблицы:
=ЕСЛИ(И(A2=A1;B2-B1=14);B1+1;0)
Условие обеспечивает попадание двух прижившихся саженцов в один ряд,
— равенство количества неприжившихся саженцев между прижившимися 13-и. Если условия выполнились — записываем в ячейку номер первого неприжившегося саженца из 13-и.
Отфильтруем данные по столбцу , убрав все нули, и получим места, для которых выполнилось условие. Значения из столбцов
и
последней строчки запишем в ответ.
Решение (Python)
f = open(’m4_26_18_04.txt’)
n = int(f.readline())
tr = [list(map(int, i.split())) for i in f] # считываем файл
tr.sort() # сортируем по возрастанию значения в столбцах
max_row = 0 # максимальный ряд
min_place = 10 ** 10 # минимальное подходящее место в максимальном ряду
for i in range(len(tr) - 1):
# если ряды рядом двух стоящих совпадают
if tr[i][0] == tr[i + 1][0]:
# если между ними есть 13 свободных мест
if tr[i + 1][1] - tr[i][1] == 14:
if max_row == tr[i][0]: # если номер максимального ряда совпадает с текущим рассматриваемым рядом
min_place = min(min_place, tr[i][1] + 1) # вычисляем минимальное подходящее место в максимальном ряду
else:
min_place = tr[i][1] + 1
max_row = tr[i][0]
print(max_row, min_place)