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