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

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

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

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

Задача 21#63973Максимум баллов за задание: 2

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
with open(’26_1.txt’) as f:
    m,k,n=map(int, f.readline().split())
    s=[list(map(int, f.readline().split())) for _ in range(n)]
s.sort(key=lambda x: (x[0], -x[1]))
per=[[0]*(m+1) for _ in range(k)]
cnt=0
for st,fn in s:
    for i in range(k):
        if per[i][st]==0:
            cnt+=1
            for j in range(st,fn):
                per[i][j]=1
            break
c_per=0
for p in range(1,m+1):
    if all(per[i][p]==1 for i in range(k)):
        c_per+=1
print(cnt, c_per)

Ответ: 2290 405

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

Задача 22#63975Максимум баллов за задание: 2

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

Найдите количество пассажиров, которые сдадут свой багаж в камеры за 24 часа и номер камеры, в которую сдаст багаж последний пассажир.

Входные данные. В первой строке входного файла находится число A – количество камер хранения, во второй строке файла число B – количество пассажиров, сдающих багаж (натуральное число, не превышающее 1000). Каждая из следующих B строк содержит два натуральных числа, не превышающих 1600: время сдачи багажа и время выдачи багажа.

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

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

Решение (Python)

f = open(’26_3__1vv31.txt’)
k = int(f.readline()) # количество камер хранения
n = int(f.readline()) # количество пассажиров, сдающих багаж
# Создаём список, в котором будут храниться данные о времени,
# когда каждый пассажир собирается сдавать и забирать вещи
a = []
for i in range(n):
    st, end = map(int, f.readline().split())
    a.append([st,end])
# Применяем сортировку, чтобы пассажиры приходили в том порядке, который задан временем их прихода
a.sort()

count = 0 # Кол-во пассажиров, сдавших багаж
last = 0 # Номер камеры, в которую примут вещи у последнего пассажира
# Список с данными о каждой камере
kamera = [[0,0]]*k

# Перебор пассажиров
for i in range(n):
    # Проходимся по каждой камере
    for j in range(k):
        # Если из текущей камеры багаж заберут раньше,
        # чем придёт пассажир, то помещаем багаж пассажира в эту камеру
        if kamera[j][1] < a[i][0]:
            kamera[j] = a[i]
            count += 1
            # Сохраняем номер последней ячейки
            # (прибавляем единицу, так как нумерация мастеров с единицы, а не с нуля)
            last = j+1
            # Прерываем внутренний цикл, чтобы перейти к следующему пассажиру
            break

print(count, last)

Ответ: 358 2

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

Задача 23#63976Максимум баллов за задание: 2

В детском летнем лагере есть А комнат, предназначенных для размещения приехавших детей. Все комнаты пронумерованы, начиная с единицы. Дети в лагере приезжают и уезжают группами. Известно время, в которое группы детей заселяются в комнаты, и время, в которое они планируют их освободить, а также количество комнат, которое потребуется для того, чтобы разместить всю группу детей сразу. Каждая группа детей заселяется в свободные номера с наименьшими индексами. Известно, что если несколько групп детей приехали в одинаковое время, то прежде всего заселяются группы, которые планируют уехать раньше и для размещения которых требуется меньшее количество номеров. На заселение и выселение детей уходит одна минута. Со следующей минуты можно заселять в освободившуюся комнату других детей. Если группа детей пришла, но необходимого количества (которого достаточно для заселения их всех) свободных комнат нет – вся группа разом заселиться не может, потому их забирают родители домой.

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

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

Отсчёт ведётся от начала суток (1800), для каждой группы – в отдельной строке.

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

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

Решение (Python)

f = open(’26_4__1vv32.txt’)
k = int(f.readline()) # количество жилых комнат
n = int(f.readline()) # количество групп детей
a = sorted(list(map(int, f.readline().split())) for _ in range(n)) # считываем файл и сортируем данные
numbers = [-1]*k # симулируем номера, в каждой ячейке списка будет записано время освобождения данного номера
# словарь, в котором в качества ключа указана минута, а в качестве значения будет указано сколько номеров занято в данную минуту
free_time = {minute: 0 for minute in range(1,1801)}
count = 0
for start, end, quantity in a: # перебор групп детей
    # если есть такое количество свободных комнат, которое необходимо текущей группе детей
    if len([time for time in numbers if time<start]) >= quantity:
        # то начинается процесс заселения детей в комнаты
        while quantity>0: # пока текущая группа детей не заняла необходимые ей комнаты
            for number in range(k): # перебор комнат
                if numbers[number]<start: # если время приезда текущей группы больше времени освобождения этой комнаты группой, которая заняла эту комнату
                    numbers[number]=end # записываем время освобождения комнаты текущей группой
                    quantity-=1 # уменьшаем количество необходимых комнат для детей, так как только что в одну комнату дети заселились
                    for minute in range(start, end+1): # проход по минутам от времени приезда до минуты уезда
                        free_time[minute]+=1 # отмечаем, что в данные минуты на одну комнату занято будет больше
                    break
        count+=1 # увеличиваем счётчик заселившихся групп детей
# вывод количества заселившихся групп и суммарного времени в течении которого хотя бы одна комната была свободна
print(count, sum(free_time[minute] < k for minute in free_time))

Ответ: 241 1447

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

Задача 24#63978Максимум баллов за задание: 2

В цветочный магазин привезли А упаковок цветов различных видов. Цветы сортируют по В холодильным камерам, вместимость каждой из которых равна С. Холодильные камеры пронумерованы от 1 до В. Фасовщики заполняют холодильные камеры последовательно, начиная с 1-й. Сначала погружают цветы наибольшего объема, стремясь заполнить текущую холодильную камеру до предела, а оставшееся свободное место начиняют цветами наименьшего объема. Цветы были рассортированы по описанному выше алгоритму, часть цветов могла не влезть.

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

Входные данные. В первой строке содержится число А - количество упаковок цветов (натуральное число, не привышающее 6000). Во второй строке содержится число В - количество холодильных камер. В третьей строке содержится число С - вместимость холодильной камеры.В следующих А строках содержаться объемы цветов.

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

Вложения к задаче
Показать ответ и решение
f = open(’26_6__1vv35.txt’)
A = int(f.readline()) # Считываем количество упаковок цветов
B = int(f.readline()) # Считываем количество холодильных камер
C = int(f.readline()) # Считываем вместимость холодильных камер
tovar = sorted(list(map(int, f.readlines())))[::-1] # Считываем объемы цветов и сортируем по убыванию

cameras = [C] * B # Создаем B камер по C вместимости каждый
last = 0 # Номер камеры, в которой положили последнюю упаковку

for c in range(len(cameras)): # Проходимся по холодильным камерам
    for t in range(len(tovar)): # Проходимся по упаковкам цветов
        if cameras[c] >= tovar[t]: # Если свободное место позволяет положить текущую упаковку
            cameras[c] -= tovar[t] # То кладем упаковку и записываем оставшееся место в камере
            tovar[t] = 0 # Текущую упаковку обнуляем
            last = c + 1
        else:
            break # Переходим к следующей камере

    for t in range(len(tovar)):
        if cameras[c] >= tovar[len(tovar) - t - 1]: # Проверяем, можем ли дополнить камеру упаковками маленького объема
            cameras[c] -= tovar[len(tovar) - t - 1] # Если да, то перезаписываем оставшееся место
            if tovar[len(tovar) - t - 1] != 0: # Уложенную упаковку обнуляем
                tovar[len(tovar) - t - 1] = 0
                last = c + 1
print(last, cameras[last - 1])

Ответ: 400 61

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

Задача 25#63979Максимум баллов за задание: 2

В школьной столовой всего есть 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

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

Задача 26#63980Максимум баллов за задание: 2

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

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

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

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

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

Решение (Python)

file = open(’26_8__1vv37__34yhg.txt’)
count_people, count_child, count_teacher = map(int,file.readline().split())  # Считываем из файла количество людей,детей и учителей
array_people = []
for people in file:#Проходимся по всему файлу
    start, duration, category = people.split()
    start, duration = int(start), int(duration)
    array_people += [(start,duration,category)]#Добавление в список всех значений из файла
array_people.sort()
count = 0
places_A = [0]*count_teacher # посадочные места учителей
places_B = [0]*count_child # посадочные места детей
places = [places_A,places_B]
# проход по людям
for start,duration,category in array_people:
    ok = False # Переменная-флаг, которая описывает сел ли текущий человек на место или нет. Изначально мы его еще никуда не посадили
    if category == ’B’:# Проверяем, какой категории принадлежит пришедший человек, если это учитель
        for i in range(len(places_B)):#Проход по всевозможным местам для детей
            if start > places_B[i]:#Если время прихода текущего ребенка больше чем время ухода ребенка,который занимает данное место
                places_B[i] = start + duration#То в ячейку записываем время ухода текущего ребенка
                count += 1
                ok = True
                break# Прерываем цикл перебора мест и переходим к следующему человеку
    else:
        ok = False# Переменная-флаг, которая описывает сел ли текущий человек на место или нет. Изначально мы его еще никуда не посадили
        for i in range(len(places_A)):
            if start > places_A[i]:#Если время прихода текущего взрослого больше, чем время ухода того взрослого, который занимает текущее место
                places_A[i] = start + duration# Тогда записываем время ухода текущего взрослого
                count += 1
                ok = True# Посадили человека на место. Значение флага делаем True
                break# Прерываем цикл перебора мест и переходим к следующему человеку
        if not ok:#Если учителя мы не смогли посадить на место для учителей
            for i in range(len(places_B)):# Проход по всевозможным местах для детей
                if start > places_B[i]:
                    places_B[i] = start + duration
                    count += 1
                    ok = True
                    break
# Нам нужно вывести количество людей, которые сели за место и количество людей, которые не сели за место
#Количество тех, кто не сел за место можно посчитать так: общее количество людей - количество людей, кто сел за место
print(count,count_people-count)

Ответ: 502 98

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

Задача 27#63982Максимум баллов за задание: 2

В Москве открылся новый ресторан. В нем есть А столиков. После каждого клиента столик необходимо убрать, на это уходит 15 минут. Уборка начинается через две минуты после того, как уходит гость. Новый клиент может сесть в следующую минуту после завершения уборки. Ресторан работает с 7:00 и закрывается в 21:00. Все клиенты должны уйти не позже 21:00. За это время в него приходит В клиентов. (Гарантируется, что они придут не раньше 7:00, а планируют уйти не позже 21:00).

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

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

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

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

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

Решение (Python)

f=open(’26_10__30v17.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 = [0]*k # список, симулирующий каждое рабочее место, в котором будет записано время, в которое освободится каждое место
ans1=0
ans2=0
# проход по клиентам
for client in clients:
    ok = False # флаг, которые показывает нужно ли человеку ждать или нет
    # проход по всем столикам
    for i in range(k):
        # если время прихода текущего клиента больше чем время освобождения данного места другим клиентом и при этом текущий клиент уйдёт ранее закрытия магазина и придет позже или во время открытия
        if client[0]>table[i] and client[0] >= 420 and client[1] <= 60*21:
            table[i]=client[1]+17 # записываем время ухода текущего клиента с учётом уборки данного места после него
            ok = True # помечаем, что для текущего клиента нашли место
            ans1+=1 # увеличиваем счётчик пришедших клиентов
            ans2=i+1 # запоминаем номер места, куда сел последний клиент
            break # прерываем цикл - переходим к следующему клиенту
    if not ok: # если клиенту нужно подождать
        mt=min(table) # определяем место, которое освободится в ближайшее время
        mintime=mt-client[0]+1 # определяем время, которое человеку нужно подождать прежде чем сесть за него
        if mintime<=30: # если время ожидания не более 30 минут
            ind=table.index(mt) # определяем индекс данного места в списке
            T=client[1]-client[0] # считаем время T
            if table[ind]+1+T<=1260: # если данный клиент уйдёт не позже закрытия
                table[ind]+=2+T+15+1 # то сажаем данного человека за место
                ans1+=1 # увеличиваем счётчик пришедших клиентов
                ans2=ind+1 # запоминаем номер места, куда сел последний клиент
print(ans1,ans2)

Ответ: 552 34

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

Задача 28#63983Максимум баллов за задание: 2

В детском центре есть K аттракционов. Все аттракционы пронумерованы, начиная с 1. Известно время, в которое каждый ребенок хочет начать свою поездку на аттракционе, и в какое время он закончит кататься на нём. Если на аттракционе никто не катается, он считается свободным. Каждый ребенок выбрает свободный аттракцион, который имеет наименьший номер. Если в момент прихода ребенка все аттракционы заняты, то ребенок уходит, не дожидаясь освобождения одного из них. Если некоторые дети придут в парк одновременно, они будут кататься на одном и том же аттракционе вместе. Для того, чтобы остановить и запустить аттракцион заново, необходимо 1 минута. Со следующей минуты следующие дети могут воспользоваться аттракционом. Каждый ребенок за весь день может покататься только на одном аттракционе.

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

Входные данные. В первой строке входного файла находится два числа K – количество аттракционов в парке развлечений и N – количество детей, которые придут в этот парк (натуральные числа, не превышающее 2000). В следующих N строках находятся два значения: минута прихода и минута, не раньше которой ребенок закончит кататься на аттракционе, отсчёт ведётся от начала суток (все числа неотрицательные, не превышающие 1600), для каждого ребенка – в отдельной строке.

Запишите в ответе два целых числа через пробел: сначала количество детей, которое сможет воспользоваться аттракционами в парке развлечений за 24 часа, затем номер аттракциона, на котором прокатится последний ребенок.

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

Решение (Python)

f = open(’26_11__1vv3b.txt’)
k, n = map(int,f.readline().split())
a = sorted([list(map(int, i.split())) for i in f])

# переменная для подсчета количества человек
count = 0
lt = 0
# переменная которая хранит время запуска определенного атракциона
d_s = [-1]*k
# переменная которая хранит время остановки определенного атракциона
d_e = [-1]*k
# цикл по людям
for x in a:
    start,end = x
    # цикл по аттракционам
    for j in range(k):
        # если время запуска больше времени останова прошлого раза
        # или если время запуска равно, так как 2 (и более) человека могут кататься на одном аттракционе одновременно
        if start > d_e[j] or (start == d_s[j]):
            # прибавляем колчество прокатившихся, обновляем переменные конца и начала
            count+=1
            d_s[j] = start
            d_e[j] = end
            lt = j+1
            # останавливаем цикл, так как для этого человека уже найден аттракцион
            break
print(count,lt)

Ответ: 139 6

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

Задача 29#63984Максимум баллов за задание: 2

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

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

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

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

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

Решение (Python)

f = open(’26_12__30v1f.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 # список, симулирующий каждое рабочее место, в котором будет записано время, в которое освободится каждое место
ans1 = 0
ans2 = 0
for client in clients: # проход по каждому клиенту
    ok = False # флаг, которые показывает нужно ли человеку ждать или нет
    for i in range(k):
        # если время прихода текущего клиента больше чем время освобождения данного места другим клиентом
        if client[0] >= table[i]:
            table[i] = client[1] + 22 # записываем время ухода текущего клиента с учётом уборки данного места после него
            ok = True # помечаем, что для текущего клиента нашли место
            ans1 += 1 # увеличиваем счётчик пришедших клиентов
            ans2 = i + 1 # запоминаем номер места, куда сел последний клиент
            break # прерываем цикл - переходим к следующему клиенту
    if not ok: # если клиенту нужно подождать
        mt = min(table) # определяем место, которое освободится в ближайшее время
        if client[0] + 3 >= mt:  # если время ожидания не более 3 минут
            ind = table.index(mt) # определяем индекс данного места в списке
            T = client[1] - client[0] # считаем время T
            if table[ind] + T <= 1200: # если данный клиент уйдёт не позже закрытия
                table[ind] += T + 22 # то сажаем данного человека за место
                ans1 += 1 # увеличиваем счётчик пришедших клиентов
                ans2 = ind + 1 # запоминаем номер места, куда сел последний клиент
print(ans1, ans2)

Ответ: 864 98

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

Задача 30#63985Максимум баллов за задание: 2

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

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

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

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

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

Решение (Python)

f = open(’26_13__1vv3e.txt’)
# Считываем количество ячеек в камере хранения (K) и количество пассажиров (N)
k = int(f.readline())
n = int(f.readline())
# Создаем список для хранения времени сдачи и выдачи багажа каждого пассажира
# и считываем эти данные из файла, разделяя каждую строку на два числа
a = [list(map(int, i.split())) for i in f]
# Сортируем список пассажиров по времени сдачи багажа
a.sort()
# Создаем список для хранения состояния каждой ячейки (занята/свободна)
s = [-1]*k
# Инициализируем переменные для подсчета количества сданных багажей
# и для хранения номера последней занятой ячей
count = last = 0
# Проходим по каждому пассажиру
for i in range(n):
    # Проходим по каждой ячейке в камере хранения
    for j in range(len(s)):
        # Если время сдачи багажа текущего пассажира больше времени освобождения ячейки
        if a[i][0] > s[j]:
            # Увеличиваем счетчик сданных багажей
            count += 1
            # Занимаем текущую ячейку багажом пассажира
            s[j] = a[i][1] + 10
            # Обновляем номер последней занятой ячейки
            last = j + 1
            # Прерываем внутренний цикл, чтобы перейти к следующему пассажиру
            break
# Выводим количество сданных багажей и номер последней занятой ячейки
print(count, last)

Ответ: 155 37

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

Задача 31#63986Максимум баллов за задание: 2

В цветочный магазин привезли А упаковок цветов различных видов. Цветы сортируют по В холодильным камерам, вместимость каждой из которых равна С. Холодильные камеры пронумерованы от 1 до В. Фасовщики заполняют холодильные камеры последовательно, начиная с 1-й. Сначала погружают цветы наибольшего объема, стремясь заполнить текущую холодильную камеру до предела, а оставшееся свободное место начиняют цветами наименьшего объема.

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

Входные данные. В первой строке содержится число А - количество упаковок цветов (натуральное число, не привышающее 6000). Во второй строке содержится число В - количество холодильных камер. В третьей строке содержится число С - вместимость холодильной камеры.В следующих А строках содержаться объемы цветов.

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

Вложения к задаче
Показать ответ и решение
f = open(’26_14__1vv3g.txt’)
A = int(f.readline()) # Считываем количество упаковок цветов
B = int(f.readline()) # Считываем количество холодильных камер
C = int(f.readline()) # Считываем вместимость холодильных камер
tovar = sorted(list(map(int, f.readlines())))[::-1] # Считываем объемы цветов и сортируем по убыванию

cameras = [C] * B # Создаем B камер по C вместимости каждый
last = 0 # Номер камеры, в которой положили последнюю упаковку

for c in range(len(cameras)): # Проходимся по холодильным камерам
    for t in range(len(tovar)): # Проходимся по упаковкам цветов
        if cameras[c] >= tovar[t]: # Если свободное место позволяет положить текущую упаковку
            cameras[c] -= tovar[t] # То кладем упаковку и записываем оставшееся место в камере
            tovar[t] = 0 # Текущую упаковку обнуляем
            last = c + 1
        else:
            break # Переходим к следующей камере

    for t in range(len(tovar)):
        if cameras[c] >= tovar[len(tovar) - t - 1]: # Проверяем, можем ли дополнить камеру упаковками маленького объема
            cameras[c] -= tovar[len(tovar) - t - 1] # Если да, то перезаписываем оставшееся место
            if tovar[len(tovar) - t - 1] != 0: # Уложенную упаковку обнуляем
                tovar[len(tovar) - t - 1] = 0
                last = c + 1
print(last, cameras[last - 1])

Ответ: 200 4

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

Задача 32#63987Максимум баллов за задание: 2

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

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

Входные данные. В первой строке файла задано три числа: 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

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

Задача 33#64076Максимум баллов за задание: 2

В аэропорту Домодедово для хранения багажа есть K ячеек, которые пронумерованы с 1. Принимаемый багаж кладется в свободную ячейку с минимальным номером. Известно время, когда пассажиры сдают и забирают багаж (в минутах с начала суток). Ячейка доступна для багажа, начиная со следующей минуты после окончания срока хранения. Если свободных ячеек не находится, то багаж не принимается в камеру хранения и пассажир уходит, не дожидаясь освобождения ячейки. В случае если несколько пассажиров пришли сдавать багаж, то первым сдает багаж тот, кто быстрее заберёт багаж обратно.

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

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

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

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

Решение (Python)

f = open(’26__1w6n4.txt’)
# Считываем количество ячеек в камере хранения (K) и количество пассажиров (N)
k = int(f.readline())
n = int(f.readline())
# Создаем список для хранения времени сдачи и выдачи багажа каждого пассажира
# и считываем эти данные из файла, разделяя каждую строку на два числа
a = [list(map(int, i.split())) for i in f]
# Сортируем список пассажиров по времени сдачи багажа
a.sort()
# Создаем список для хранения состояния каждой ячейки (занята/свободна)
s = [-1]*k
# Инициализируем переменные для подсчета количества сданных багажей
# и для хранения номера последней занятой ячей
count = last = 0
# Проходим по каждому пассажиру
for i in range(n):
    # Проходим по каждой ячейке в камере хранения
    for j in range(len(s)):
        # Если время сдачи багажа текущего пассажира больше времени освобождения ячейки
        if a[i][0] > s[j]:
            # Увеличиваем счетчик сданных багажей
            count += 1
            # Занимаем текущую ячейку багажом пассажира
            s[j] = a[i][1]
            # Обновляем номер последней занятой ячейки
            last = j + 1
            # Прерываем внутренний цикл, чтобы перейти к следующему пассажиру
            break
# Выводим количество сданных багажей и номер последней занятой ячейки
print(count, last)

Ответ: 375 8

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

Задача 34#81219Максимум баллов за задание: 2

В городе N расположено тайм-кафе (кафе, в котором люди платят не за продукты и заказы, а за то, сколько времени они провели в нём). 1 минута – 5 рублей. Входной файл содержит заявки клиентов. В заявке указано время прихода клиента и время ухода клиента. Клиент занимает один из столиков с минимальным номером. Столы пронумерованы начиная с единицы. Следующий клиент может занять столик со следующей минуты после освобождения столика. Если пришло несколько клиентов одновременно, то садится за стол клиент с наименьшим временем пребывания. Время ухода клиента также идёт в учёт стоимости его посещения заведения, время ухода занимает 1 минуту. Если в момент прибытия клиента все столы заняты, то клиент уходит. Определите сколько клиентов сможет занять столик, а также сколько рублей тайм-кафе заработает.

Входные данные: В первой строке файла находится натуральное число K, не превышающее 1000, – количество столиков в тайм кафе. Во второй строке файла находится натуральное число N, не превышающее 1000 – количество клиентов. В последующих строках записано по два числа, не превышающих 1440: время прибытия клиента, время ухода клиента.

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

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

Решение (Python)

file = open(’26_1.txt’)
count_tables = int(file.readline()) #количество столиков в тайм-кафе
count_client = int(file.readline()) #количество клиентов

#считываем и сортируем время прибытия и ухода для каждого клиента
array_client = sorted(list(map(int,i.split())) for i in file)

count = 0 #количество клиентов, занявших столик
cost = 0 #сумма заработанных денег

#инициализируем список, в котором будем хранить  у соответствующего столика время ухода клиента
tables = [-1]*count_tables

for start,end in array_client: #проходимся циклом по каждому клиенту
    for i in range(len(tables)): #проходимся по списку столиков
        if start > tables[i]: #если время прибытия клиента больше, чем значение у столика
            tables[i] = end #тогда записываем за столик время ухода клиента
            count += 1
            cost += 5 * (end - start + 1)# 1 минута = 5 рублей. Учитываем также минуту ухода
            break
print(count,cost)

Ответ: 112 175100

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

Задача 35#81220Максимум баллов за задание: 2

В городе N расположено тайм-кафе (кафе, в котором люди платят не за продукты и заказы, а за то, сколько времени они провели в нём). 1 минута – 7 рублей. Входной файл содержит заявки клиентов. В заявке указано время прихода клиента и время ухода клиента. Клиент занимает один из столиков с минимальным номером. Столы пронумерованы начиная с единицы. Следующий клиент может занять столик со следующей минуты после освобождения столика. Если пришло несколько клиентов одновременно, то садится за стол клиент с наименьшим временем пребывания. Минута ухода клиента не идёт в учёт стоимости его посещения заведения. Если в момент прибытия клиента все столы заняты, то клиент ждёт ближайший столик, который освободится раньше всего, не более 10 минут и садится за него. Если за 10 минут не нашлось свободного столика, то клиент уходит. Тайм-кафе в качестве компенсации предоставляет ему такое количество бесплатных минут, равное времени его ожидания столика. Клиент обязательно пробудет T минут (T – разница между временем прибытия и отбытия) и дополнительно проведет компенсированное время в тайм-кафе. Определите сколько клиентов сможет занять столик, а также сколько рублей тайм-кафе заработает.

Входные данные: В первой строке файла находится натуральное число K, не превышающее 1000, – количество столиков в тайм кафе. Во второй строке файла находится натуральное число N, не превышающее 1000 – количество клиентов. В последующих строках записано по два числа, не превышающих 1440: время прибытия клиента, время ухода клиента.

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

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

Решение (Python)

file = open(’26_1__3cjum.txt’)
count_tables = int(file.readline())  # количество столиков в тайм-кафе
count_client = int(file.readline())  # количество клиентов

# считываем и сортируем время прибытия и ухода для каждого клиента
array_client = sorted(list(map(int, i.split())) for i in file)

count = 0  # количество клиентов, занявших столик
cost = 0  # сумма заработанных денег

# инициализируем список, в котором будем хранить  у соответствующего столика время ухода клиента
tables = [-1] * count_tables

for start, end in array_client:  # проходимся циклом по каждому клиенту
    ok = False  # флаг, сел клиент за столик или нет
    for i in range(len(tables)):  # проходимся по списку столиков
        if start >= tables[i] + 1:  # если время прибытия клиента больше, чем значение у столика
            tables[i] = end  # тогда записываем за столик время ухода клиента
            count += 1
            cost += 7 * (end - start)  # 1 минута = 7 рублей.
            ok = True
            break

    if not ok:  # если флаг равен False
        min_table = min(tables)  # ищем ближайшее время ухода другого клиента
        wait = min_table - start + 1  # Высчитываем время ожидания клиента,
        # количество минут, которое клиенту нужно подождать чтобы занять место за столиком
        if wait <= 10:  # если ожидание меньше 10 минут
            ind = tables.index(min_table)
            T = end - start
            # Увеличиваем время освобождения найденного столика на:
            # 1 - так как нужно учесть, что сесть можно со следующей минуты
            # Т - так как клиент ждал столика Т минут
            # wait - так как ему добавили бесплатные минуты за ожидание
            tables[ind] += 1 + T + wait
            count += 1
            cost += 7 * T
            ok = True

print(count, cost)

Ответ: 107 243712

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

Задача 36#81221Максимум баллов за задание: 2

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

Входные данные: В первой строке файла находится натуральное число K, не превышающее 1000, – количество покупателей. Во второй строке файла находится натуральное число N, не превышающее 1000 – количество камер хранения в магазине. В последующих строках записано по два числа, не превышающих 1500: время прибытия клиента, время ухода клиента.

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

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

Решение (Python)

file = open(’26_2.txt’)
count_client = int(file.readline()) #количество клиентов
count_cameras = int(file.readline()) #количество камер хранения
#сортируем клиентов по времени прибытия и ухода
array_clients = sorted(list(map(int,i.split())) for i in file)
count = 0
last = 0
cameras = [-1]*count_cameras #инициализируем список камер
for start,end in array_clients: #проходимся циклом по каждому клиенту
    for i in range(len(cameras)):  #проходимся по списку камер
        if start > cameras[i]: #если есть камера, которая освободится ко времени прихода клиента
            cameras[i] = end #присваиваем камере время выдачи вещи клиенту
            count += 1
            last = i + 1
            break
print(count,last)

Ответ: 157 2

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

Задача 37#81222Максимум баллов за задание: 2

В магазине есть N камер хранения. Номера камер начинаются с 1. В магазин приходят покупатели и оставляют свои вещи в камерах хранениях. Покупатель занимает одну из камер с минимальным номером. Следующий покупатель может занять камеру хранения со следующей минуты после освобождения камеры. Освобождение камеры длится 3 минуты. Известно время сдачи вещей каждого покупателя и время выдачи вещей каждому покупателю. Если свободных камер нет, то покупатели уходят. Если осталась свободной только одна камера, а в один момент пришло несколько покупателей, то вещи в камеру положит клиент, у которого меньшее количество времени вещи будут находиться в камере.

Входные данные:В первой строке файла находится натуральное число K, не превышающее 1000, – количество покупателей. Во второй строке файла находится натуральное число N, не превышающее 1000 – количество камер хранения в магазине. В последующих строках записано по два числа, не превышающих 1500: время прибытия клиента, время ухода клиента.

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

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

Решение (Python)

file = open(’26_2__3cjv5.txt’)
count_client = int(file.readline()) #количество клиентов
count_cameras = int(file.readline()) #количество камер хранения
#сортируем клиентов по времени прибытия и ухода
array_clients = sorted(list(map(int,i.split())) for i in file)
count = 0
last = 0
cameras = [-1]*count_cameras #инициализируем список камер

for start,end in array_clients:  #проходимся циклом по каждому клиенту
    for i in range(len(cameras)): #проходимся по списку камер
        if start > cameras[i]: #если есть камера, которая освободится ко времени прихода клиента
            cameras[i] = end+3 #присваиваем камере время выдачи вещи клиенту + 3 минуты освобождения камеры
            count += 1
            last = i + 1
            break
print(count,last)

Ответ: 155 29

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

Задача 38#81223Максимум баллов за задание: 2

В магазине есть N камер хранения. Номера камер начинаются с 1. В магазин приходят покупатели и оставляют свои вещи в камерах хранениях. Покупатели приходят с вещами различных габаритов (маленький, средний, большой) и занимают камеру, подходящую под хранение вещи по её габаритам. Если камеры для хранения вещи подходящей по ее размерам нет, то покупатель может положить свою вещь в камеру предназначенной для более габаритных вещей. Покупатель занимает одну из камер с минимальным номером. Следующий покупатель может занять камеру хранения со следующей минуты после освобождения камеры. Известно время сдачи вещей каждого покупателя и время выдачи вещей каждому покупателю, а также категория размера вещи покупателя (A – маленькая, B – средняя, C – большая). Если осталась свободной только одна камера, а в один момент пришло несколько покупателей, то вещи в камеру положит клиент, у которого меньшее количество времени вещи будут находиться в камере.

Входные данные: В первой строке файла находится натуральное число K, не превышающее 1000, – количество покупателей. Во второй строке файла находится натуральное число N, не превышающее 1000 – количество камер хранения в магазине каждой категории. В последующих строках записано по два числа и букве, не превышающих 1500: время прибытия клиента, время ухода клиента, размер вещи покупателя.

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

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

Решение (Python)

file = open(’26_3__3cjvn.txt’)
count_client = int(file.readline()) #количество клиентов
count_cameras = int(file.readline()) #количество камер хранения
array_clients = []
#заполняем список клиентов: время их прибытия, их ухода и категория вещи (A -- 0, B -- 1, C -- 2)
for i in file:
    temp = i.split()
    # используем функцию ord для того чтобы буквы перевести в числа для дальнейшего удобного использования адресации к элементам в списках
    start,end,cat = int(temp[0]),int(temp[1]),ord(temp[2]) % 65
    array_clients += [[start,end,cat]]
array_clients = sorted(array_clients) #сортируем по возрастанию
count = 0
last = 0
#инициализуруем камеры для каждой категории
cameras = [[-1 for i in range(count_cameras)] for j in range(3)]

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

Ответ: 273 B

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

Задача 39#81224Максимум баллов за задание: 2

В магазине есть N камер хранения. Номера камер начинаются с 1. В магазин приходят покупатели и оставляют свои вещи в камерах хранениях. Покупатели приходят с вещами различных габаритов (маленький, средний, большой) и занимают камеру, подходящую под хранение вещи по её габаритам. Если камеры для хранения вещи подходящей по ее размерам нет, то покупатель уходит. Покупатель занимает одну из камер с минимальным номером. Следующий покупатель может занять камеру хранения со следующей минуты после освобождения камеры. Известно время сдачи вещей каждого покупателя и время выдачи вещей каждому покупателю, а также категория размера вещи покупателя (A – маленькая, B – средняя, C – большая). Если осталась свободной только одна камера, а в один момент пришло несколько покупателей, то вещи в камеру положит клиент, у которого меньшее количество времени вещи будут находиться в камере.

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

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

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

Решение (Python)

file = open(’26_3.txt’)
count_client = int(file.readline()) #количество клиентов
count_cameras = int(file.readline()) #количество камер хранения
array_clients = []

#заполняем список клиентов: время их прибытия, их ухода и категория вещи (A -- 0, B -- 1, C -- 2)
for i in file:
     temp = i.split()
     # используем функцию ord для того чтобы буквы перевести в числа для дальнейшего удобного использования адресации к элементам в списках
     start,end,cat = int(temp[0]),int(temp[1]),ord(temp[2]) % 65
     array_clients += [[start,end,cat]]

array_clients = sorted(array_clients) #сортируем по возрастанию
count = 0
last = 0
#инициализуруем камеры для каждой категории
cameras = [[-1 for i in range(count_cameras)] for j in range(3)]

for start,end,cat in array_clients: #проходимся по списку клиентов
    for i in range(len(cameras[cat])):  #проходимся по категории cоответствующей размера вещи клиента и по категориям большего размера
        if start > cameras[cat][i]: #если встречаем камеру, которая освободится к приходу клиента
            cameras[cat][i] = end #присваиваем ей время ухода клиента
            count += 1
            last = chr(cat+65) # используем функцию chr для того чтобы узнать букву категории камеры
            break # прерываем цикл - переходим к следующему человеку
print(count,last)

Ответ: 271 B

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

Задача 40#81225Максимум баллов за задание: 2

В магазине есть N камер хранения. Номера камер начинаются с 1. В магазин приходят покупатели и оставляют свои вещи в камерах хранениях. Покупатели приходят с вещами различных габаритов (маленький, средний, большой) и занимают камеру, подходящую под хранение вещи по её габаритам. Если камеры для хранения вещи подходящей по ее размерам нет, то покупатель может положить свою вещь в камеру предназначенной для более габаритных вещей. Покупатель занимает одну из камер с минимальным номером. Следующий покупатель может занять камеру хранения со следующей минуты после освобождения камеры. Известно время сдачи вещей каждого покупателя и время выдачи вещей каждому покупателю, а также категория размера вещи покупателя (A – маленькая, B – средняя, C – большая). Если осталась свободной только одна камера, а в один момент пришло несколько покупателей, то вещи в камеру положит клиент, у которого меньшее количество времени вещи будут находиться в камере.

Входные данные:В первой строке файла находится натуральное число K, не превышающее 1000, - количество покупателей. Во второй строке файла находится три натуральных числа N, M, V: N – количество камер хранения категории А, M – количество камер хранения категории B, V – количество камер хранения категории C. В последующих строках записано по два числа и букве, не превышающих 1500: время прибытия клиента, время ухода клиента, размер вещи покупателя.

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

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

Решение (Python)

file = open(’26_4__3cjwn.txt’)
count_client = int(file.readline()) #количество клиентов
cat_A, cat_B , cat_C = map(int,file.readline().split()) #считываем количество камер  каждой категории
cameras_A = [-1]*cat_A #инициализируем список камер типа А
cameras_B = [-1]*cat_B #инициализируем список камер типа B
cameras_C = [-1]*cat_C #инициализируем список камер типа C
cameras = [cameras_A,cameras_B,cameras_C] #составляем список
count_cameras = [0,0,0]
count = 0
array_client = []

#заполняем список клиентов: время их прибытия, их ухода и категория вещи (A -- 0, B -- 1, C -- 2)
for i in file:
    temp = i.split()
    # используем функцию ord для того чтобы буквы перевести в числа для дальнейшего удобного использования адресации к элементам в списках
    start,end,category = int(temp[0]),int(temp[1]),ord(temp[2]) % 65
    array_client += [[start,end,category]]
array_client = sorted(array_client)  #сортируем по возрастанию

for start,end,category in array_client:  #проходимся по списку клиентов
    ok = False  #флаг, отдали ли вещь в камеру хранения
    for cat in range(category,len(cameras)): #проходимся по категории и по категориям большего размера
        for i in range(len(cameras[cat])): #цикл для прохождения всех камер в данной категории
            if start > cameras[cat][i]: #если встречаем камеру, которая освободится к приходу клиента
                cameras[cat][i] = end #присваиваем ей время ухода клиента
                count += 1
                count_cameras[cat] += 1 #прибавляем единицу к нужной категории
                ok = True # отмечаем, что нашли для человека камеру
                break
        if ok: #если вещь в камере, то прерываем цикл - переходим к следующему человеку, иначе проверяем камеры для более габаритных вещей
            break
print(count)
# используем функцию chr для того чтобы получить букву категории, в которую положили больше всего вещей
print(chr(count_cameras.index(max(count_cameras)) + 65))

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