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

В школьной столовой всего есть 270 посадочных мест. Места делятся на две категории: для сотрудников школы и для детей. Для сотрудников школы выделено 20 мест, для детей — 250. Сотрудник школы может занять любое место в своей категории, при этом, если все места заняты, он может пересесть на место для детей. Однако ребенок не может сесть на место, предназначенное для сотрудника школы. Занять место можно одновременно с его освобождением – в ту же минуту. Если человек не находит себе свободного места, он уходит из столовой голодный.

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

Первая строка входного файла содержит целое число N – общее количество людей в школе, которые за учебный день придут в столовую. Каждая из следующих N строк описывает человека и содержит 2 целых числа и букву. Первое число означает время в минутах с начала суток, когда человек пришёл в столовую, второе – необходимую длительность обеда в минутах. Буква означает тип человека: A – ребенок, B – сотрудник школы.

Гарантируется, что одновременно два человека не может прийти в столовую.

В ответе запишите два целых числа: сначала количество человек, которые смогут пообедать, затем – общее количество человек, которые уйдут из-за отсутствия мест.

file = open(’26_7__1vv36.txt’)
# считываем количество людей в файле
count_people = int(file.readline())
peoples = [] # список, в котором будут записаны люди
for i in range(count_people):
    start,duration,type = file.readline().split() # считываем текущую строку
    start,duration = int(start),int(duration) # переводим в число время прихода и длительность обеда
    # используем функцию ord для перевода буквы в число и проверяем равно ли 0. А станет 1, а В станет 0. Это сделано для удобства дальнейшего обращения со списком
    type = (ord(type) % 65) == 0
    peoples.append([start,duration,type])
# симулируем столовую. 20 мест для учителей, 250 мест - для детей
places = [[-1 for i in range(20)],[-1 for i in range(250)]]

count = 0
# перебор людей
for start,duration,category in peoples:
    ok = False # флаг, который указывает нашли ли место для человека или нет
    # перебор категории посадочных мест
    for cat in range(category,2):
        # перебор посадочных мест определенной категории
        for i in range(len(places[cat])):
            # если время прихода больше времени освобождения человеком, который уже занял данное место
            if start > places[cat][i]:
                places[cat][i] = start + duration # то записываем время освобождения места текущим человеком
                count += 1 # увеличиваем счётчик
                ok = True # отмечаем, что нашли место для человека
                break # сбрасываем цикл
        if ok: # если для текущего человека нашли место
            break # то сбрасываем цикл и переходим к следующему человеку
print(count,count_people - count)

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