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

Известно, что путь автобуса проходит через А городов. У контроллёра есть список, содержащий В заявок на поездку. В каждой заявке указано на какой остановке пассажир будет садиться в автобус и на какой остановке он выйдет. Известно, что в автобусе всего С мест. На остановках сначала происходит высадка пассажиров, затем посадка. Когда пассажиры приходят на посадку, контролёр в первую очередь пропускает того, чей путь дольше остальных. При этом место пассажира определеяется как свободное и чей номер минимален.

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

Входные данные. В первой строке файла задано три числа: M (2 ≤ M ≤ 3000) – количество населенных пунктов, в которых останавливается автобус, K (1 ≤ K ≤ 1000) – количество мест в автобусе и N (1 ≤ N ≤ 10000) – количество пассажиров, желающих проехать на автобусе. В каждой из последующих N строк располагаются пары чисел: сначала номер населенного пункта, откуда хочет начать свою поездку пассажир, затем номер населенного пункта, где пассажир собирается сойти с автобуса.

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

Решение (Python)

f = open(’26_15__1vv3h.txt’)
# Считали первую строку
a, c, b = map(int, f.readline().split())

# Считали данные о пассажирах
data = []
for i in range(b):
    x, y = map(int, f.readline().split())
    data.append([x, y])
data.sort(key=lambda x: (x[0], -x[1]))  # Отсортировали по возрастанию первого элемента и убыванию второго

# Создали список для каждого из мест. places[i][point] отвечает за i-ое место и будет хранить 0 или 1, в зависимости
# от того, занято ли оно в населенном пункте point.
places = [[0] * (a + 1) for i in range(c)]

counter = 0  # Количество пассажиров, которые смогут добраться до нужной им станции
cnt_areas = 0  # Количество участков между соседними городами, в которых места будут полностью заняты

# Перебираем для каждого пассажира места и ищем свободные
for st, fin in data:
    for i in range(c):
        # Если место свободно на данном населённом пункте, то сажаем сюда пассажира
        if places[i][st] == 0:
            counter += 1
            # Резервируем данное место на все населённые пункты с st по fin не включительно. То есть место будет свободно
            # в населённом пункте с индексом fin, так как пассажир на нём сойдёт.
            for j in range(st, fin):
                places[i][j] = 1
            break

# Перебираем для каждого населённого пункта все места и смотрим, чтобы все эти места были заполнены
for p in range(1, a + 1):
    if all(places[i][p] == 1 for i in range(c)):
        cnt_areas += 1
print(cnt_areas, counter)

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