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

В лес­ни­че­стве са­жен­цы сосны вы­са­ди­ли па­рал­лель­ны­ми ря­да­ми, ко­то­рые про­ну­ме­ро­ва­ны иду­щи­ми под­ряд на­ту­раль­ны­ми чис­ла­ми. Рас­те­ния в каж­дом ряду про­ну­ме­ро­ва­ны на­ту­раль­ны­ми чис­ла­ми на­чи­ная с еди­ни­цы.

По дан­ным аэро­фо­то­съёмки из­вест­но, в каких рядах и на каких ме­стах рас­те­ния не при­жи­лись. Най­ди­те ряд с наи­боль­шим но­ме­ром, в ко­то­ром есть ровно 13 иду­щих под­ряд сво­бод­ных мест для по­сад­ки новых сосен, таких, что не­по­сред­ствен­но слева и спра­ва от них в том же ряду рас­тут сосны. Га­ран­ти­ру­ет­ся, что есть хотя бы один ряд, удо­вле­тво­ря­ю­щий этому усло­вию. В от­ве­те за­пи­ши­те два целых числа: наи­боль­ший номер ряда и наи­мень­ший номер места для по­сад­ки из числа най­ден­ных в этом ряду под­хо­дя­щих по­сле­до­ва­тель­но­стей из 13 сво­бод­ных мест.

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

26.txt

В пер­вой стро­ке вход­но­го файла на­хо­дит­ся число N  — ко­ли­че­ство при­жив­ших­ся са­жен­цев сосны (на­ту­раль­ное число, не пре­вы­ша­ю­щее 20 000). Каж­дая из сле­ду­ю­щих N строк со­дер­жит два на­ту­раль­ных числа, не пре­вы­ша­ю­щих 100 000: номер ряда и номер места в этом ряду, на ко­то­ром растёт де­рев­це.

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

Два целых не­от­ри­ца­тель­ных числа: наи­боль­ший номер ряда и наи­мень­ший номер места в вы­бран­ной по­сле­до­ва­тель­но­сти из 13 мест, под­хо­дя­щих для по­сад­ки новых сосен.

Ти­по­вой при­мер ор­га­ни­за­ции вход­ных дан­ных:

7

40 3

40 7

60 33

50 125

50 129

50 68

50 72

Для при­ведённого при­ме­ра, при усло­вии, что не­об­хо­ди­мо 3 сво­бод­ных места, от­ве­том яв­ля­ет­ся пара чисел: 50; 69.

Ти­по­вой при­мер имеет ил­лю­стра­тив­ный ха­рак­тер. Для вы­пол­не­ния за­да­ния ис­поль­зуй­те дан­ные из при­ла­га­е­мых фай­лов.

 

Ответ:

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

Ре­ше­ние.

1.  Счи­та­ем все пары в дву­мер­ный мас­сив, где пер­вое число  — номер ряда, вто­рое  — номер места. Номер места счи­та­ем как от­ри­ца­тель­ное зна­че­ние, чтобы при сор­ти­ров­ке места с мень­шим но­ме­ром (по дан­ным из файла) были боль­ше (в дан­ных). Это су­ще­ствен­но со­кра­тит поиск нуж­но­го места.

2.  От­сор­ти­ру­ем мас­сив.

3.  Най­дем по­след­ний эле­мент в от­сор­ти­ро­ван­ном мас­си­ве, ко­то­рый удо­вле­тво­ря­ет усло­ви­ям:

a)  два за­ня­тых места на­хо­дят­ся в одном ряду;

b)  раз­ни­ца между про­ве­ря­е­мым ме­стом и преды­ду­щим равна 14.

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

 

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

var f: text;

n, i, r, m, a, b: integer;

nums: array of array of integer;

begin

setlength(nums, 0);

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

reset(f);

readln(f, n);

loop n do begin

readln(f, a, b);

nums := nums + ||a, -b||;

end;

Sort(nums, (x, y) -> ((x[0] < y[0]) or (x[0] = y[0]) and (x[1] < y[1])));

r := 0; m := 0;

for i := 1 to nums.Length - 1 do

if nums[i, 0] = nums[i-1, 0] then

if nums[i, 1] - nums[i-1, 1] = 14 then begin

r := nums[i, 0];

m := -nums[i, 1] + 1;

end;

print(r, m);

end.

 

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

 

Ответ: 59966 50449.

 

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

 

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

f = open("107_26.txt")

n = int(f.readline())

nums = list()

for i in f:

a, b = i.split()

a = int(a)

b = int(b)

nums.append([a, -b])

nums.sort()

r = 0

m = 0

for i in range(1, n):

if nums[i][0] == nums[i - 1][0]:

if nums[i][1] - nums[i - 1][1] == 14:

r = nums[i][0]

m = -nums[i][1] + 1

print(r, m)

 

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

f = open("107_26.txt")

n = int(f.readline())

nums = sorted([int(i) for i in x.split()] for x in f)

rmax = 0

for i in range(1, n):

r,m = nums[i-1]

if r == nums[i][0] and nums[i][1] - m == 14:

if r > rmax: rmax, mmin = r, m

print(rmax, mmin+1)

 

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

f = open("107_26.txt")

f.readline()

a = []

for i in f:

b = i.split()

a.append([int(b[0]), -int(b[1])])

a.sort()

a = a[::-1]

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

if a[j][0] == a[j+1][0] and (a[j][1] - a[j+1][1]) == 14:

print(a[j][0],1 - a[j][1])

break

 

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

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

p=[(a[i][0],a[i-1][1]) for i in range(1,len(a)) if a[i][0]==a[i-1][0] and a[i][1]-a[i-1][1]==14]

maxrow=max(x[0] for x in p)

place=min(x[1] for x in p if x[0]==maxrow)

print(maxrow,place+1)

Источник: ЕГЭ по ин­фор­ма­ти­ке 04.04.2022. До­сроч­ная волна