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

В аэро­пор­ту есть ка­ме­ра хра­не­ния из K ячеек, ко­то­рые про­ну­ме­ро­ва­ны с 1.

При­ни­ма­е­мый багаж кла­дет­ся в сво­бод­ную ячей­ку с ми­ни­маль­ным но­ме­ром. Из­вест­но время, когда пас­са­жи­ры сдают и за­би­ра­ют багаж (в ми­ну­тах с на­ча­ла суток). Ячей­ка до­ступ­на для ба­га­жа, на­чи­ная со сле­ду­ю­щей ми­ну­ты, после окон­ча­ния срока хра­не­ния. Если сво­бод­ных ячеек не на­хо­дит­ся, то багаж не при­ни­ма­ет­ся в ка­ме­ру хра­не­ния.

Най­ди­те ко­ли­че­ство ба­га­жей, ко­то­рое будет сдано в ка­ме­ры за 24 часа и номер ячей­ки, в ко­то­рую сдаст багаж по­след­ний пас­са­жир.

За­да­ние 26

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

В пер­вой стро­ке вход­но­го файла на­хо­дит­ся число K  — ко­ли­че­ство ячеек в ка­ме­ре хра­не­ния, во вто­рой стро­ке файла число N  — ко­ли­че­ство пас­са­жи­ров, сда­ю­щих багаж (на­ту­раль­ное число, не пре­вы­ша­ю­щее 1000). Каж­дая из сле­ду­ю­щих N строк со­дер­жит два на­ту­раль­ных числа, не пре­вы­ша­ю­щих 1440: время сдачи ба­га­жа и время вы­да­чи ба­га­жа.

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

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

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

2

4

30 1000

60 100

61 1100

1010 1440

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

 

Ответ:

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

Ре­ше­ние.

Счи­та­ем файл в мас­сив и от­сор­ти­ру­ем его. Будем по­сле­до­ва­тель­но за­пол­нять каж­дую ячей­ку, про­ве­ряя, чтобы время уклад­ки но­во­го ба­га­жа от­ли­ча­лось от вре­ме­ни за­бо­ра ба­га­жа преды­ду­щим пас­са­жи­ром на 1 и более. Также будем за­по­ми­нать номер по­след­ней ячей­ки, куда был сдан багаж.

 

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

f = open('26.txt')

k = int(f.readline())

n = int(f.readline())

a = sorted([list(map(int, i.split())) for i in f])

count = 0

maxt = kposled = 0

for i in range (1, k+1):

start = 0

for x in a:

if x[0]-start >= 1 and x[0] > 0 and x[1] > 0:

count +=1

start = x[1]

if x[0] >= maxt:

maxt = x[0]

kposled = i

x[0] = -1

x[1] = -1

print(count, kposled)

 

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

 

Ответ: 586  3.

 

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

 

При­ведём ре­ше­ние Ев­ге­ния Дж­об­са (без сор­ти­ров­ки, с ис­поль­зо­ва­ни­ем сло­ва­ря).

Для наи­бо­лее удоб­но­го по­ис­ка ба­га­жа за­ве­дем сло­варь вида «время сдачи»: «вре­ме­на вы­да­чи». Так как в за­да­че не ука­за­но, что нет ба­га­жей, ко­то­рые сда­ют­ся од­но­вре­мен­но, не­об­хо­ди­мо преду­смот­реть хра­не­ние не­сколь­ких ба­га­жей с оди­на­ко­вым вре­ме­нем сдачи. При таком из­ме­не­нии мы можем опре­де­лять есть ли ба­га­жи с про­ве­ря­е­мым вре­ме­нем сдачи за O(1) с по­мо­щью ко­ман­ды time in bags.

from collections import defaultdict

with open('26.txt') as f:

k = int(f.readline())

n = int(f.readline())

bags = defaultdict(list)

for i in range(n):

a, b = map(int, f.readline().split())

bags[a].append(b)

storage = [-1]*(k+1) # хра­ни­ли­ще

last = cnt = 0

for time in range(1440): # пе­ре­би­ра­ем ми­ну­ты

if time in bags: # есть багаж в оче­ре­ди

for end in bags[time]:

for cell in range(1,k+1):

if storage[cell] == -1:# пу­стая ячей­ка

storage[cell], last = end, cell

cnt += 1

break

for cell in range(k):

if storage[cell] == time: # багаж за­би­ра­ют

storage[cell] = -1 # осво­бож­да­ем ячей­ку

print(cnt, last)

 

При­ведём ре­ше­ние Ана­то­лия Ха­ча­ту­ро­ва на языке Python.

f = open('26.txt')

k = int(f.readline())

n = int(f.readline())

data = [list(map(int, i.split())) for i in f]

data = sorted(data)

sp = []

for n in range(k):

sp.append([0])

c = 0

spi = []

for r in data:

for place in sp:

if r[0] >= place[0]:

c +=1

place.remove(place[0])

place.append(r[1] + 1)

spi.append(sp.index(place))

break

print(spi[-1] + 1, c)

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