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

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

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

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

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

За­да­ние 26

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

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

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

 

Ответ:

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

Ре­ше­ние.

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

f = open('26.txt').readlines()[1:]

SL = {i: [] for i in range(1, 10**5 + 1)}

for i in f:

ind, v = map(int, i.split())

SL[ind] += [v]

def func(V):

if not V: return -1

ma = -1

for i, x in enumerate(V):

for v0, v1 in zip(V[i:], V[i+1:]):

if v1 - v0 <= 8:

ma = max(ma, v1 - x + 1)

else: break

return ma

SL = {i: func(sorted(set(v))) for i, v in SL.items()}

print((t:=max(SL.values())), list(SL.keys())[::-1][list(SL.values())[::-1].index(t)])

 

Ответ: 26 97586.

 

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

f = open('26.txt')

f.readline()

a = []

for i in f:

a.append([int(str(i).split()[0]), int(str(i).split()[1])])

a.sort(key=lambda x: x[0])

max1 = 0

ii = 0

while ii < len(a):

b = []

z = a[ii][0]

while a[ii][0] == z:

b.append(a[ii][1])

ii += 1

if ii >= len(a):

break

b.sort()

m = 1

for j in range(len(b)-1):

if b[j+1] - b[j] <= 8:

m += b[j+1] - b[j]

else:

if m >= max1:

max1 = m

nn = a[ii - 1][0]

m = 1

if m >= max1:

max1 = m

nn = a[ii - 1][0]

print(max1,nn)

 

 

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

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

a = sorted(set(a)) # из­бав­ля­ем­ся от по­вто­ров и сор­ти­ру­ем

# в дан­ной за­да­че из­бав­лять­ся от по­вто­ров было не­обя­за­тель­но

maxlen = 0 # мак­си­маль­ная длина

b = a[0] # на­ча­ло пер­вой линии

for i in range(1,len(a) + 1):

if i == len(a) or a[i][0] != a[i-1][0] or a[i][1] - a[i-1][1] > 8: # линия кон­чи­лась

l = a[i-1][1] - b[1] + 1 # длина линии

if l >= maxlen: # линия не ко­ро­че преж­не­го мак­си­му­ма

row = b[0] # за­по­ми­на­ем ряд

maxlen = l # за­по­ми­на­ем длину линии

if i < len(a): b = a[i] # на­ча­ло новой линии

print(maxlen,row)


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