Тема 26. Обработка целочисленной информации с использованием сортировки

26.06 Распределение объектов по местам (хранение багажа, парковки, кафе, гостиницы)

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#63601

На парковке есть D мест для легковых автомобилей и E мест для автобусов. Приезжающий на парковку автомобиль занимает любое подходящее свободное место, при этом легковой автомобиль может встать на свободное место, предназначенное для автобуса, но автобус не может занять место, предназначенное для легкового автомобиля. Если подходящего свободного места нет, автомобиль уезжает. Если два автомобиля приезжают одновременно, при этом занять место может только один из них, занимает тот, который будет стоять меньше по времени. Если время прибытия автомобиля совпадает со временем окончания стоянки другого автомобиля, вновь прибывший автомобиль может занять освободившееся место, если оно подходит ему по типу.

Определите количество автобусов, которые смогут припарковаться, и общее количество автомобилей (как легковых, так и автобусов), которые уедут из-за отсутствия мест.

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

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

Вложения к задаче
Показать ответ и решение

Решение (Python)

file = open(’26_2__1vn99.txt’)
# считываем количество машин в файле
count_cars,count_A,count_B = map(int,file.readline().split())
cars = [] # список, в котором будут записаны машины
for i in range(count_cars):
    start,duration,type = file.readline().split() # считываем текущую строку
    start,duration = int(start),int(duration) # переводим в число время приезда и длительность парковки
    # используем функцию ord для перевода буквы в число. А станет 0, а В станет 1. Это сделано для удобства дальнейшего обращения со списком
    type = ord(type) % 65
    cars.append([start,duration,type]) # добавляем запись о машине в список
cars.sort() # сортируем список
# симулируем парковку, списки парковочных мест для каждой категории
parking = [[-1 for i in range(count_A)],[-1 for i in range(count_B)]]
all_cars_count = 0 # количество припаркованных машин любого вида
count_cars_B = 0 # количество припаркованных автобусов
for start,duration,category in cars: # перебор машин в списке
    # флаг, который показывает нашли мы ли место для парковки для текущей машины или нет.
    # Это сделано, с той целью, чтобы позже сбросить циклы перебора категории и перебор парковочных мест определенной категории.
    ok = False
    # перебираем категорию для парковочного места
    for categ in range(category,2):
        # перебираем парковочные места определенной категории
        for i in range(len(parking[categ])):
            # если время приезда текущей машины совпадает или больше времени уезда той, что уже припаркована на данном парковочном месте
            if start >= parking[categ][i]:
                parking[categ][i] = start + duration # то припарковываем текущую машину на это парковочное место
                all_cars_count += 1 # увеличиваем количество припаркованных машин любого вида
                if category == 1: # если текущая машина - автобус
                    count_cars_B += 1 # то увеличиваем счётчик припаркованных автобусов
                ok = True # отмечаем, что машину припарковали
                break # сбрасываем цикл, переходим к следующей категории
        if ok: # если текущую машину припарковали
            break # то сбрасываем цикл, чтобы перейти к следующей машине
# Вывод количества припаркованных автобусов и количества не припаркованных машин любого вида
print(count_cars_B,count_cars - all_cars_count)

Ответ: 151 253

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!