26.05 Поиск мест на поле (билеты, саженцы, матрицы)
Ошибка.
Попробуйте повторить позже
Организация купила для своих сотрудников все места в нескольких подряд идущих рядах на концертной площадке. В каждом ряду 1000 мест (отсчёт мест в ряду начинается с 1). Известно, какие места уже распределены между сотрудниками. Найдите ряд с наибольшим номером, в котором есть три занятых места, попарно разделенных свободным (занято-свободно-занято-свободно-занято), таких что слева и справа от них в том же ряду места свободны (не заняты). Гарантируется, что есть хотя бы один ряд, удовлетворяющий условию.
Входные данные:
В первой строке входного файла находится одно число: — количество занятых мест (натуральное число, не
превышающее
). В следующих
строках находятся пары чисел: ряд и место выкупленного билета, не
превышающие
.
В ответе запишите два целых числа: наибольший номер ряда и наибольший номер центрального места из найденных трёх занятых.
Решение (Excel/LibreOffice)
Сначала перенесем данные из файла в Excel, скопировав и вставив с разделителем пробел, а также удалим первую строчку.
Настраиваемой сортировкой отсортируем в первую очередь по столбцу по возрастанию, во вторую - по столбцу
по возрастанию.
Выделим полностью столбцы и
, перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты,
в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит деревья, которые были по ошибке сняты
дважды).
В LibreOffice Calc необходимо также выделить оба столбца, применить фильтр и перейти в раздел Фильтр по условию -> Стандартный фильтр.
В условиях фильтра необходимо через И выбрать столбцы и
, установить значение Не пусто и поставить
галочку напротив Без повторений. После чего нужно скопировать отфильтрованные значения на новый лист и
работать уже там.
Чтобы определить тройку мест в необходимом нам порядке, запишем в ячейку и растянем до конца таблицы
следующую формулу:
=ЕСЛИ(И(A1=A2;A2=A3;B2-B1=2;B3-B2=2);B2;0)
Условия и
обеспечивает попадание трех мест в один ряд,
и
-
свободные места в нужных промежутках.
Отфильтруем данные по столбцу , убрав все нули, и получим места, для которых выполнилось условие. Значения
из столбцов
и
последней строчки запишем в ответ.
Решение (Python)
f = open(’m5_26_18_04__3u8xl.txt’) n = int(f.readline()) old_tr = [list(map(int, i.split())) for i in f] old_tr.sort() tr = [] # список, в котором будут только уникальные координаты for i in old_tr: if not(i in tr): tr.append(i) #словарь, в котором в качестве ключа будет указан номер ряда, #а в качестве значения будет список из занятых мест на этом ряду matrix = [[0 for j in range(1001)] for i in range(1001)] for i in tr: matrix[i[0]][i[1]] = 1 max_row = 0 place = 0 c = 0 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: # проверка того, что слева и справа от этой тройки занятых мест есть свободные места temp_row = matrix[tr[i][0]] # список занятых и свободных мест текущего ряда # для проверки есть ли свободные места слева и справа от тройки используем функцию index, # которая возвращает индекс первого вхождения данного элемента # для проверки того, что слева есть свободные места мы начинаем поиск с 1-ого индекса, # так как отсчёт мест в ряду начинается с 1. if (tr[i][1] - temp_row.index(0,1,tr[i][1]) > 1 and tr[i+2][1] - temp_row.index(0,tr[i+2][1],len(temp_row))): max_row = tr[i][0] place = tr[i + 1][1] print(max_row, place)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!