Задания
Версия для печати и копирования в MS Word
Тип 26 № 75263
i

При про­ве­де­нии экс­пе­ри­мен­та за­ря­жен­ные ча­сти­цы по­па­да­ют на чув­стви­тель­ный экран, пред­став­ля­ю­щий из себя мат­ри­цу раз­ме­ром 100 000 на 100 000 точек. При по­па­да­нии каж­дой ча­сти­цы на экран в про­то­ко­ле фик­си­ру­ют­ся ко­ор­ди­на­ты по­па­да­ния: номер ряда (целое число от 1 до 100 000) и номер по­зи­ции в ряду (целое число от 1 до 100 000).

Точка экра­на, в ко­то­рую по­па­ла хотя бы одна ча­сти­ца, счи­та­ет­ся свет­лой, точка, в ко­то­рую ни одна ча­сти­ца не по­па­ла,  — тёмной.

При ана­ли­зе ре­зуль­та­тов экс­пе­ри­мен­та рас­смат­ри­ва­ют изо­ли­ро­ван­ные точки.

Точка на­зы­ва­ет­ся изо­ли­ро­ван­ной, если эта точка свет­лая (не­за­ви­си­мо от того, сколь­ко ча­стиц в неё по­па­ло), а дру­гие свет­лые точки в том же ряду либо от­сут­ству­ют, либо на­хо­дят­ся на рас­сто­я­нии более 500.

Вам не­об­хо­ди­мо по за­дан­но­му про­то­ко­лу опре­де­лить наи­боль­шее ко­ли­че­ство изо­ли­ро­ван­ных точек, рас­по­ло­жен­ных в одном ряду, и номер ряда, в ко­то­ром это ко­ли­че­ство встре­ча­ет­ся. Если таких рядов не­сколь­ко, ука­жи­те мак­си­маль­но воз­мож­ный номер.

За­да­ние 26

 

Вход­ные дан­ные.

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство ча­стиц, по­пав­ших на экран. Каж­дая из сле­ду­ю­щих N строк со­дер­жит 2 целых числа: номер ряда и номер по­зи­ции в ряду.

В от­ве­те за­пи­ши­те два целых числа: сна­ча­ла мак­си­маль­ное ко­ли­че­ство изо­ли­ро­ван­ных точек в одном ряду, затем  — номер ряда, в ко­то­ром это ко­ли­че­ство встре­ча­ет­ся.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

f = open('26.txt')

N = int(f.readline())

matrix = [[] for i in range(100001)]

n_row = {}

maxi = 0

for i in f:

row, cell = map(int, i.split())

if cell not in matrix[row]:

matrix[row].append(cell)

for i in range(1, 100001):

if matrix[i]:

current = [-100001] + sorted(matrix[i]) + [100001]

tmp = sum(current[j] - current[j-1] > 500 and current[j+1] - current[j] > 500 for j in range(1, len(current) - 1))

maxi = max(maxi, tmp)

n_row[i] = tmp

print(maxi, list(dict(sorted(n_row.items(), key=lambda n_row:n_row[1])))[-1])

 

Ответ: 20; 58612.

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

screen=set([tuple(map(int,s.split())) for s in open('26.txt')][1:])

points=sorted(screen)

rows={}

for x in points: rows[x[0]]=rows.get(x[0],[])+[x[1]]

ans=[]

for r in rows:

k=0

for i in range(len(rows[r])):

if (i==0 or rows[r][i]-rows[r][i-1]>500) and (i==len(rows[r])-1 or rows[r][i+1]-rows[r][i]>500): k+=1

ans.append((k,r))

ans.sort()

print(*ans[-1])


Аналоги к заданию № 75263: 75290 Все