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

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

За­да­ние 26

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

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

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

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

 

Ответ:

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

Ре­ше­ние.

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

File = open("pr1.txt")

N, M, K = map(int, File.readline().split())

places = []

for i in range(N):

row, place = map(int, File.readline().split())

places.append([place, row])

places.sort()

maxCount = 0

minRow = 0

for p in range(1, N):

previousPlace = places[p - 1][0]

previousRow = places[p - 1][1]

currentPlace = places[p][0]

currentRow = places[p][1]

if currentPlace == previousPlace:

count = (currentRow - 1) - (previousRow + 1)

if maxCount < count:

maxCount = count

minRow = currentRow - 1

elif maxCount == count:

minRow = min(minRow, currentRow - 1)

elif currentPlace - previousPlace == 1:

count = M - (previousRow + 1)

if maxCount < count:

maxCount = count

minRow = M

elif maxCount == count:

minRow = min(minRow, M)

count = currentRow - 2

if maxCount < count:

maxCount = count

minRow = currentRow - 1

elif maxCount == count:

minRow = min(minRow, currentRow - 1)

else:

maxCount = K - 1

minRow = M

break

print(minRow, maxCount)

 

Ответ: 665  61.

 

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

data = open('2626.txt').read().strip().split('\n')

n, m, k = map(int, data.pop(0).split())

occupied_places = [[0, m + 1] for i in range(k)]

for row in data:

row_m, row_k = map(int, row.split())

occupied_places[row_k - 1].append(row_m)

occupied_places = [sorted(places) for places in occupied_places]

distances = []

for i, values in enumerate(occupied_places):

for place_index in range(len(values) - 1):

current_place = values[place_index]

next_place = values[place_index + 1]

distance = next_place - current_place - 2

if distance >= 0:

distances.append([next_place - 1, distance])

distances.sort(key=lambda x: (-x[1], x[0]))

print(distances[0])

 

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

f=open('2626.txt')

n,m,k=map(int, f.readline().split())

a=sorted([list(map(int,s.split())) for s in f],key=lambda x: x[::-1])

maxpust=max([a[i][0]-a[i-1][0] for i in range(1,len(a)) if a[i][1] == a[i-1][1]])

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

print(min(rows),maxpust-2)

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