Задача к ЕГЭ по информатике на тему «Поиск мест на поле (билеты, саженцы, матрицы)» №1

В лесополосе осуществляется посадка деревьев. Причем саженцы высаживают рядами на одинаковом расстоянии.

Через какое-то время осуществляется аэросъемка, в результате которой определяется, какие саженцы прижились. Необходимо определить ряд с максимальным номером, в котором есть ровно 2  неприжившихся саженца, при условии, что справа и слева от них саженцы прижились, а также прижился ровно один саженец между ними. При аэросъемке была совершена ошибка — одно и то же дерево могло быть снято дважды. В ответе запишите сначала наибольший номер ряда, затем наименьший номер из найденных 2  неприжившихся мест в этом ряду.

Входные данные:

В первой строке входного файла находится число N  — количество сфотографированных прижившися саженцев (натуральное число, не превышающее 110000  ). Каждая из следующих N  строк содержит два натуральных числа, не превышающих 10000  : номер ряда и номер саженца.

Выходные данные:

Два целых неотрицательных числа: максимальный номер ряда, где нашлись обозначенные в задаче саженцы, и минимальный номер подходящего саженца.

Решение при помощи электронных таблиц:

Сначала перенесем данные из файла в Excel, скопировав и вставив с разделителем пробел, а также удалим первую строчку.

Настраиваемой сортировкой отсортируем в первую очередь по столбцу A  по возрастанию, во вторую — по столбцу B  по возрастанию.

PIC

PIC

Выделим полностью столбцы A  и B  , перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты, в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит деревья, которые были по ошибке сняты дважды).

В LibreOffice Calc необходимо также выделить оба столбца, применить фильтр и перейти в раздел Фильтр по условию -> Стандартный фильтр.

В условиях фильтра необходимо через И выбрать столбцы A  и B  , установить значение Не пусто и поставить галочку напротив Без повторений. После чего нужно скопировать отфильтрованные значения на новый лист и работать уже там.

PIC

PIC

Чтобы определить, пропущены ли два саженца через один среди прижившихся, в ячейку C1  запишем формулу и растянем её до конца таблицы:

=ЕСЛИ(И(A1=A2;A2=A3;B2-B1=2;B3-B2=2);B1+1;0)

Условие A1 = A2;A2 = A3  обеспечивает попадание трех прижившихся саженцов в один ряд, B2 − B1 = 2;B3 − B2 = 2  — нахождение трёх прижившихся саженцев через одно свободное место друг от друга. Если условия выполнились — записываем в ячейку номер первого неприжившегося саженца из 2-х.

Отфильтруем данные по столбцу C  , убрав все нули, и получим места, для которых выполнилось условие. Значения из столбцов A  и C  последней строчки запишем в ответ.

 

Программное решение

f = open(’26_dif_2__40zqo.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) - 2):
    # если ряд трёх рядом стоящих в списке мест совпадает
    if tr[i][0] == tr[i + 1][0] == tr[i + 2][0]:
        # проверка, что между каждыми двумя прижившимися саженцами есть одно свободное место
        if tr[i + 1][1] - tr[i][1] == tr[i + 2][1] - tr[i + 1][1] == 2:
            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)

Ответ: 3421 5019
Оцените статью
Я решу все!