Задача к ЕГЭ по информатике на тему «задачи под вебы» №15

Входной файл содержит заявки пассажиров, желающих сдать свой багаж в камеру хранения. В заявке указаны время сдачи багажа и время освобождения ячейки (в минутах от начала суток). Багаж одного пассажира размещается в одной свободной ячейке с минимальным номером. Ячейки пронумерованы начиная с единицы. Размещение багажа в ячейке или её освобождение происходит в течение 1 мин. Багаж можно поместить в только что освобожденную ячейку начиная со следующей минуты. Если в момент сдачи багажа свободных ячеек нет, то пассажир уходит.

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

Определите максимальную сумму двух времен сдачи багажа, кратную 60.

f = open(’26-111.txt’)
k = int(f.readline()) # Количество ячеек
n = int(f.readline()) # Количество пассажиров
# Сортировка по времени сдачи багажа
a = sorted([list(map(int, i.split())) for i in f])
cells = [[] for i in range(k)] # Ячейки
pax = [] # Пассажиры
c = 0 # Счетчик пассажиров, сдавших багаж
for i in a: # Для каждого пассажира
    for j in cells: # проверяем все ячейки
# Если ячейка пустая или успевает освободиться
        if (not j) or (i[0] > j[-1][1]):
            j.append(i) # Cкладываем багаж в ячейку
            pax.append(i[1]-i[0]) # Время нахождения багажа в ячейке
            c += 1 # Увеличиваем счетчик пассажиров
            break # Останавливаем цикл, так как уже разместили багаж
m = [0]*60 # Максимальные значения с разными остатками от деления на 60
mx = 0 # Максимальная сумма
for i in range(len(pax)-1): # Проверяем каждого пассажира
# Выбираем максимум между текущим и существующим значением
    m[pax[i] % 60] = max(m[pax[i] % 60], pax[i])
    d = (60-(pax[i+1] % 60)) % 60 # Значение противоположного от 60ти остатка
# Если сумма текущего времени и максимального c остатком d больше mx
    if (pax[i+1]+m[d]) > mx and m[d] > 0:
        mx = pax[i+1]+m[d] # Обновляем mx
print(mx)

Ответ:
Оцените статью
Я решу все!