При проведении эксперимента заряженные частицы попадают на чувствительный экран, представляющий из себя матрицу размером 100 000 на 100 000 точек. При попадании очередной частицы на экран в файл записываются координаты чувствительного элемента: номер строки (целое число от 1 до 100 000) и номер позиции в строке (целое число от 1 до 100 000). Точка экрана, в которую попала хотя бы одна частица, считается светлой, точка, в которую ни одна частица не попала, – тёмной.
Вам нужно определить наибольшую длину цепочки в одной строке, в которой светлые точки идут подряд. Если таких строк несколько, укажите номер первой из подходящих строк.
Входные данные представлены в файле следующим образом. В первой строке входного файла записано целое число N – количество частиц, попавших на экран. В каждой из следующих N строк записаны по два числа, разделённые пробелом: номер строки и номер позиции в строке.
Запишите в ответе два числа через пробел: сначала номер строки, в которой находится эта цепочка (если таких строк несколько, запишите минимальный из их номеров), затем количество светлых точек в самой длинной цепочке из светлых точек.
Решение (Excel/LibreOffice)
Открываем программу Excel и загружаем в неё наш файл. Выделяем оба столбца — А и В, переходим в раздел «Данные»и выбираем функцию «Удалить дубликаты». Теперь сортируем данные столбца А и В по возрастанию.
В ячейку помещаем число 1, в ячейку
вписываем формулу:
ЕСЛИ
И
. Накладываем фильтр на столбец С и выбираем самое большое значение — 10. Это и будет являться максимальной длиной цепочки. Так как для значения 10 у нас нашлась одна строка, то она и будет искомой.
Решение (Python)
f = open(’267__1vi96.txt’)
n = int(f.readline())
maxim = 0
row = 0
max_row = 0 # максимальный ряд в файле
max_seat = 0 # максимальное место в ряду в файле
for i in range(n):
x, y = [int(s) for s in f.readline().split()] # считывание текущей строки
max_row = max(max_row,x) # вычисляем максимальный ряд
max_seat = max(max_seat,y) # вычисляем максимальное место
f.close()
f = open(’267__1vi96.txt’)
n = int(f.readline())
a = [[0 for i in range(max_seat+1)] for j in range(max_row+1)] # матрица свободных и занятых мест
for i in range(n):
x, y = [int(s) for s in f.readline().split()] # считывание текущей строки
a[x][y] = 1 # отмечаем, что данный пиксель занят
for i in range(max_row):
counter = 0 # счетчик подряд идущих занятых пикселей
for j in range(max_seat):
if a[i][j] == 1:
counter += 1
else:
counter = 0
if counter > maxim: # если счётчик больше максимума
maxim = counter # перезаписываем максимум
row = i # записываем ряд
print(row,maxim)