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

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

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

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

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

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

За­да­ние 26

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

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

 

Ответ:

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

Ре­ше­ние.

Со­зда­дим мас­сив из 10 000 строк, каж­дая из ко­то­рых будет пред­став­лять из себя 10 000 иду­щих под­ряд нулей. Ин­декс мас­си­ва будет яв­лять­ся но­ме­ром ряда, а ин­декс по­зи­ции сим­во­ла в стро­ке будет яв­лять­ся но­ме­ром по­зи­ции в ряду. Счи­та­ем дан­ные из файла, при­сва­и­вая в со­от­вет­ству­ю­щей стро­ке со­от­вет­ству­ю­ще­му сим­во­лу еди­ни­цу вме­сто нуля. Далее с по­мо­щью стро­ко­во­го ме­то­да string.ToWords разобьём каж­дую стро­ку в мас­си­ве с раз­де­ли­те­лем «0», таким об­ра­зом по­лу­чим все по­сле­до­ва­тель­но­сти из свет­лых точек в каж­дом ряду. Далее по­сле­до­ва­тель­но пройдём по каж­дой най­ден­ной по­сле­до­ва­тель­но­сти свет­лых точек и найдём по­сле­до­ва­тель­ность с наи­боль­шей дли­ной.

 

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

var

i, j, n, x, y, maxlen, maxnum: integer;

screen: array[1..10000] of string;

screen_str: array of string;

f: text;

begin

assign(f,'C:\26.txt');

reset(f);

readln(f, n);

maxlen := 0;

for i := 1 to 10000 do screen[i] := '0' * 10000;

for i := 1 to n do begin

readln(f, x, y);

screen[x][y] := '1';

end;

for i := 1 to 10000 do begin

screen_str := screen[i].ToWords('0');

for j := 1 to screen_str.Length - 1 do

if screen_str[j].Length > maxlen then begin

maxlen := screen_str[j].Length;

maxnum := i;

end;

end;

writeln(maxlen, ' ', maxnum);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 10 2786.

 

Ответ: 10 2786.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

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

f = open('26 (11).txt')

n = int(f.readline())

a = [[0] * 10001 for j in range(10001)]

for i in range(n):

x, y = map(int, f.readline().split())

a[x][y] = 1

maxi = 0

mini = 0

for i in range(10001):

count = 0

m = 0

for j in range(10001):

if a[i][j] == 1:

count += 1

m = max(count, m)

else:

count = 0

if m > maxi:

maxi = max(maxi, m)

mini = i

print(maxi, mini)

 

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

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

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

r=[]

l=1

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

if a[i][0]==a[i-1][0] and a[i][1]-a[i-1][1]==1:

l+=1 # счи­та­ем длину груп­пы

else:

r.append( (l,a[i-1][0]) ) # длина груп­пы и ряд, в ко­то­ром она на­хо­дит­ся

l=1

r.append( (l,a[-1][0]) ) # по­след­няя груп­па

la=[x[0] for x in r] # спи­сок с дли­на­ми групп

print(*r[la.index(max(la))])


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