Задача к ЕГЭ по информатике на тему «Распределение объектов по местам (хранение багажа, парковки, кафе, гостиницы)» №1

В городе открылось кафе. В нем есть K  столиков. После каждого клиента столик необходимо убрать, на это уходит 10 минут. Из-за большой загруженности, уборка начинается через 5 минут после того, как уходит гость. Новый клиент может сесть через 5 минут после завершения уборки. Кафе работает с 7:00 и закрывается в 20:00. Все клиенты должны уйти не позже 20:00. За это время в него приходит N  клиентов. (Гарантируется, что они придут не раньше 7:00, а планируют уйти не позже 20:00).

Каждого гостя при входе встречает администратор и подбирает для него стол с минимальным номером. Может случиться так, что несколько людей придет одновременно, тогда администратор в первую очередь подбирает столик для того, кто планирует сидеть меньшее время. В случае если все столы заняты, гость готов подождать не более 3 минут, при этом за столом он пробудет обязательно T  секунд (T  – разница между временем прибытия и отбытия), в этом случае выбирается столик, который освободится раньше всего. Если таких несколько, выбирается с меньшим номером.

Определите, сколько пар клиентов смогут посетить кафе в течении дня при условии, что общее время проведенное за столиками этих клентов кратно 17.

Входные данные. На первой строке одно число N  – количество гостей, пришедших за день. На второй строке одно число K  – количество столиков в кафе. Далее N  строк, в каждой из которых указано время, когда клиент пришел и время, до которого он планировал пробыть в кафе (время дано в минутах от начала дня).

f = open(’26.txt’)
n = int(f.readline()) # считываем количество пришедших клиентов
k = int(f.readline()) # считываем количество мест в кафе

clients = [] # список клиентов
for line in f.readlines():
    a, b = map(int, line.split())
    clients.append([a, b])
clients.sort() # сортируем список клиентов
table = [-1] * k # список, симулирующий каждое столик, в котором будет записано время, в которое освободится каждое место

c17 = [0]*17 #подсчет количества пассажиров с различными остатками от деления на 17

for client in clients: # проход по каждому клиенту
    ok = False # флаг, которые показывает нужно ли человеку ждать или нет
    for i in range(k):
        # если время прихода текущего клиента больше чем время освобождения данного места другим клиентом
        if client[0] >= table[i]:
            table[i] = client[1] + 20 # записываем время ухода текущего клиента с учётом уборки данного места после него
            ok = True # помечаем, что для текущего клиента нашли место
            tim = client[1]-client[0] #время проведенное за столиком
            c17[tim % 17] += 1 #подсчитываем это время за столиком
            break # прерываем цикл - переходим к следующему клиенту
    if not ok: # если клиенту нужно подождать
        mt = min(table) # определяем место, которое освободится в ближайшее время
        if client[0] + 3 >= mt:  # если время ожидания не более 3 минут
            ind = table.index(mt) # определяем индекс данного места в списке
            tim = client[1] - client[0] # считаем время T
            if table[ind] + tim <= 1200: # если данный клиент уйдёт не позже закрытия
                table[ind] += tim + 20 # то сажаем данного человека за место
                c17[tim % 17] += 1 #подсчитываем это время за столиком

# считаем количество пар, в которых время за столиками кратно 17
pair = c17[0]*(c17[0]-1) // 2
for i in range(1, 9):
    #считаем пары с различными остатками от деления на 17, сумма которых равна 17
    pair += c17[i]*c17[17-i]
print(pair)

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