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

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

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

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

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

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

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

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

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

Решение (Python)

f = open(’26_dif_3__40zrx.txt’)
n = int(f.readline())
k = int(f.readline())

clients = [list(map(int, i.split())) for i in f]
clients.sort()
cameras = [-1] * k # список, симулирующий каждую камеру хранения, в котором будет записано время, в которое освободится каждое место

cnt = 0
sm = 0

for start, end in clients: # проход по клиентам
    for j in range(k): # проход по камерам хранения
        if start > cameras[j]:
            # Пример: предыдущий клиент уходит в 10-ю минуту
            # В 11-ю минуту начинается освобождение
            # Освобождение длится 5 минут: 11-я, 12-я, 13-я, 14-я, 15-я
            # В 16-ю минуту может занять следующий клиент
            # Значит, если в условии строгий знак, то прибавлять нужно 5
            cameras[j] = end + 5
            cnt += 1
            sm += end - start # суммируем время, в течении которого вещь будет находиться в камере
            break # сбрасываем цикл - переходим к следующему клиенту

print(n - cnt, sm)

Ответ: 1858 244078

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_dif_4.txt’)
n = int(f.readline())
k = int(f.readline())

clients = [list(map(int, i.split())) for i in f]
clients.sort()
tables = [-1] * k

cnt = 0
number = 0
client_num = 0

for start, end in clients:
    # Считаем клиентов, у первого номер 1
    number += 1
    is_sat = False
    for i in range(k):
        if start >= tables[i]:
            # Пример: предыдущий клиент уходит в 10-ю минуту
            # В 11-ю минуту начинается освобождение
            # Освобождение длится 8 минут: 11-я, 12-я, 13-я, 14-я, 15-я, 16-я, 17-я, 18-я
            # В 19-ю минуту может занять следующий клиент
            # Значит, если в условии не строгий знак, то прибавлять нужно 9
            tables[i] = end + 9
            is_sat = True
            cnt += 1
            client_num = number
            break
    if not is_sat:
        # Минимальное время освобождения столика
        min_time = min(tables)
        if start + 45 >= min_time:
            # Индекс столика с минимальным временем в нашем списке
            index = tables.index(min_time)
            # Время пребывания клиента за столом
            T = end - start
            # Проверяем, что клиент уйдёт до закрытия
            # 22 * 60 + 30 - это 22:30
            if tables[index] + T <= 22 * 60 + 30:
                tables[index] += T + 9
                cnt += 1
                client_num = number

                                                                                                  
                                                                                                  
print(cnt, client_num)

Ответ: 859 2793

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

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

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

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

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

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

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

Решение (Python)

f = open(’26_9__4106o.txt’)
k = int(f.readline())
n = int(f.readline())
a = sorted(list(map(int, i.split())) for i in f)
count = [0] * n # список, в котором будет указано сколько человек положило вещи в определенную камеру хранения
camera = [-1] * n # список, симулирующий каждую камеру хранения, в котором будет записано время, в которое освободится каждое место
last = 0
for start, end in a: # перебор клиентов
    for i in range(len(camera)): # проход по камерам хранения
        if start > camera[i]:
            camera[i] = end # записываем время освобождения камеры
            count[i] += 1 # прибавляем 1 к количеству той камеры, в которую положили вещи
            last = i # записываем номер камеры, в которую положил вещи последний клиент
            break # прерываем цикл - переходим к следующему человеку
# вывод номера камеры, в которую положил вещи последний клиент
# вывод номера камеры, в которую положило больше всего людей вещей
print(last,count.index(max(count)))

Ответ: 19 0

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

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

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

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

Определите, какое количество пар деталей было окрашено (запечено в камерах) в течение дня при условии, что общее время окраски этих деталей кратно 60 (составляет целое число минут).

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

Запишите в ответе одно число: количество пар деталей, время окраски которых кратно 60.

Вложения к задаче
Показать ответ и решение
f = open(’E:/26-27.txt’)
n = int(f.readline())
k = int(f.readline())
a = sorted([list(map(int, i.split())) for i in f])
ch = [[] for i in range(k)] #список с камерами для запекания
c60 = [0]*60 #подсчет количества деталей с различными остатками от деления на 60
for i in a: #перебор деталей
    for j in range(k): #проход по камерам для запекания в поисках свободной камеры
        if (not ch[j]) or (i[0] > ch[j][-1][1]):
            ch[j].append(i) #добавляем деталь в камеру
            tim = i[1]-i[0] #время запекания детали
            c60[tim % 60] += 1 #подсчитываем это время запекания
            break

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

Ответ: 57866

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

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

В городе открылось кафе. В нем есть 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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’2-26__674z4.txt’)
n = int(f.readline())
k = int(f.readline())
a = sorted([list(map(int, i.split())) for i in f])
ch = [-1 for i in range(k)] #список с ячейками для хранения багажа
c42 = [0]*42 #подсчет количества пассажиров с различными остатками от деления на 42
for i in a: #перебор пассажиров
    for j in range(k): #проход по ячейкам в поисках свободной
        if (i[0] > ch[j]):
            ch[j] = i[1] #добавляем багаж в ячейку
            tim = i[1]-i[0] #время хранения багажа
            c42[tim % 42] += 1 #подсчитываем это время хранения
            break

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

Ответ: 17834

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26.txt’)
n = int(f.readline())
k = int(f.readline())
a = sorted([list(map(int, i.split())) for i in f])
ch = [[] for i in range(k)] #список с ячейками для хранения багажа
mx_kr_31 = -1
c31 = [0]*31 #подсчет количества пассажиров с различными остатками от деления на 31
for i in a: #перебор пассажиров
    for j in range(k): #проход по ячейкам в поисках свободной
        if (not ch[j]) or (i[0] > ch[j][-1][1]):
            ch[j].append(i) #добавляем багаж в ячейку
            tim = i[1]-i[0] #время хранения багажа
            if tim % 31 == 0:
                if tim >= mx_kr_31:
                    c31[0] = mx_kr_31
                    mx_kr_31 = tim
                elif tim > c31[0]:
                    c31[0] = tim
            elif tim > c31[tim % 31]:
                c31[tim % 31] = tim #подсчитываем это время хранения
            break

mx_ans = c31[0]+mx_kr_31
for i in range(1, 16):
    if c31[i] + c31[31-i] > mx_ans:
        mx_ans = c31[i] + c31[31-i]
print(mx_ans)

Ответ: 168671

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

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

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

Определите количество пар клиентов, которые постирают свои вещи в супер-стиральной машине при условии, что общее время стирки (с учетом ускорения стирки) кратно 8.

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

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

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

Программа должна вывести одно число: количество подходящих пар клиентов.

Вложения к задаче
Показать ответ и решение
file = open(’26.txt’)
count_machines = int(file.readline()) # количество стиральных машин
count_client = int(file.readline()) # количество клиентов
array_client = list(list(map(int,i.split())) for i in file)
# cортируем список клиентов по возрастанию времени прихода и по убыванию времени ухода
array_client.sort(key = lambda x:(x[0],-x[1]))
machines = [-1]*count_machines # симулируем стиральные машины. В каждой ячейке будет записано время освобождения определенной стиральной машины
c8 = [0]*8 #подсчет количества стирок с различными остатками от деления на 8
for start,end in array_client: # перебор клиентов
    for i in range(len(machines)): # проход по стиральным машинам
        if start > machines[i]: # если текущий клиент может положить вещи в определенную стиральную машину
            if (i+1) % 3 == 0: # если это супер стиралка
                tim = (end - start) // 2 # то записываем время выполнения стирки в два раза быстрее
                machines[i] = start + tim
                c8[tim % 8] += 1
            else: # если это обычная стиралка
                machines[i] = end # записываем время освобождения
            break # сбрасываем цикл - переходим к следующему клиенту
# считаем количество пар, в которых время стирки
# либо кратно 8, либо даёт остаток 4 при делении на 8
pair = c8[0]*(c8[0]-1) // 2 + c8[4]*(c8[4]-1) // 2
for i in range(1, 4):
    #считаем пары с различными остатками от деления на 8, сумма которых равна 8
    pair += c8[i]*c8[8-i]
print(pair)

Ответ: 523

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

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

В прачечной есть K стиральных машин, которые пронумерованы с 1. Принимаемые вещи кладутся в свободную стиральную машину с минимальным номером. Известно время, когда клиенты сдают и забирают вещи (в минутах с начала суток). Среди стиральных машин есть супер-стиральные машины, они стирают вещи в 1.5 раза быстрее. У таких машин номер кратен 7. Если время стирки в супер-стиральной машине получилось не целым, то оно округляется до целого числа в меньшую сторону. Стиральная машина доступна для вещей, начиная со следующей минуты, после окончания срока стирки. Если свободных машинок не находится, то вещи не принимаются в стиральную машину и клиент уходит. Если в один момент пришло несколько клиентов, то в первую очередь, вещи принимаются у того, чья стирка займет большее время (без учета использования супер-стиральных машин).

Определите максимальное суммарное время стирки пары клиентов, таких что один клиент из пары постирал вещи в обычной машинке, а второй в супер-стиральной машине, при этом суммарное время должно быть кратно 19.

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

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

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

Программа должна вывести одно число: максимальное суммарное время кратное 19 подходящей пары клиентов.

Вложения к задаче
Показать ответ и решение
file = open(’26.txt’)
count_machines = int(file.readline()) # количество стиральных машин
count_client = int(file.readline()) # количество клиентов
array_client = list(list(map(int,i.split())) for i in file)
# cортируем список клиентов по возрастанию времени прихода и по убыванию времени ухода
array_client.sort(key = lambda x:(x[0],-x[1]))
machines = [-1]*count_machines # симулируем стиральные машины. В каждой ячейке будет записано время освобождения определенной стиральной машины
cs19 = [0]*19 #подсчет количества стирок с различными остатками от деления на 19
c19 = [0]*19 #подсчет количества супер-стирок с различными остатками от деления на 19
for start,end in array_client: # перебор клиентов
    for i in range(len(machines)): # проход по стиральным машинам
        if start > machines[i]: # если текущий клиент может положить вещи в определенную стиральную машину
            if (i+1) % 7 == 0: # если это супер стиралка
                tim = int((end - start) // 1.5) # то записываем время выполнения стирки в два раза быстрее
                machines[i] = start + tim
                cs19[tim % 19] = max(cs19[tim % 19], tim)
            else: # если это обычная стиралка
                machines[i] = end # записываем время освобождения
                tim = (end - start) # то записываем время выполнения стирки
                c19[tim % 19] = max(c19[tim % 19], tim)
            break # сбрасываем цикл - переходим к следующему клиенту
# считаем максимальное суммарное время кратное 19
mx_ans = c19[0] + cs19[0]
for i in range(1, 19):
  mx_ans = max(mx_ans, c19[i] + cs19[19-i])

print(mx_ans)

Ответ: 2223

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26.txt’)
n = int(f.readline())
k = int(f.readline())
a = sorted([list(map(int, i.split())) for i in f])
ch = [[] for i in range(k)] #список с ячейками для хранения багажа
mx_kr_47 = -1
c47 = [-1]*47 #подсчет количества пассажиров с различными остатками от деления на 47
for i in a: #перебор пассажиров
    for j in range(k): #проход по ячейкам в поисках свободной
        if (not ch[j]) or (i[0] > ch[j][-1][1]):
            ch[j].append(i) #добавляем багаж в ячейку
            tim = i[1]-i[0] #время хранения багажа
            if tim % 47 == 0:
                if tim >= mx_kr_47:
                    c47[0] = mx_kr_47
                    mx_kr_47 = tim
                elif tim > c47[0]:
                    c47[0] = tim
            elif tim > c47[tim % 47]:
                c47[tim % 47] = tim #подсчитываем это время хранения
            break

mx_ans = c47[0]+mx_kr_47
for i in range(1, 24):
    if c47[i] + c47[47-i] > mx_ans and c47[i] != -1 and c47[47-i] != -1:
        mx_ans = c47[i] + c47[47-i]
print(mx_ans)

Ответ: 166192

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

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

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

Входные данные представлены в файле следующим образом.

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

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

В ответе запишите одно число: найденную сумму.

Пример входного файла:

2

5

30 60

40 1000

59 60

61 1000

1010 1440

Вложения к задаче
Показать ответ и решение
f = open(’26-1.txt’)
k = int(f.readline()) # Kоличество ячеек
n = int(f.readline()) # Kоличество пассажиров

# Сортировка пассажиров по времени сдачи багажа
a = sorted([list(map(int, i.split())) for i in f])
cell = [[] for i in range(k)] # Cписок ячеек
for i in a: # Для каждой заявки пассажира
    for j in range(k): # Ищем свободную ячейку
        # Если ячейка пустая или успеет освободиться
        if (not cell[j]) or (i[0] > cell[j][-1][1]):
            cell[j].append(i) # Добавляем заявку в ячейку
            break # Останавливаем поиск

# Вычисляем длительность каждого хранения багажа в ячейках
t = [[j[1]-j[0] for j in i] for i in cell]
s = 0 # Сумма всех длительностей
mr = 1000050000 # Минимальная разница
for i in t: # Проходим по каждой ячейке
    line = sorted(i) # Сортировка длительностей по возрастанию
    s += line[0] # Добавление минимальной длительности к общей сумме
    if len(line) > 1: # Если в ячейке больше одной длительности
        for j in range(1, len(line)): # Ищем минимальную нечетную разницу
            if (abs(line[0]-line[j]) < mr) and (abs(line[0]-line[j]) % 2 !=0):
                mr = abs(line[0]-line[j]) # Обновляем минимальную нечетную разницу
if s % 2 != 0:
    s = s + mr
print(s)

Ответ: 213128

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

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

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

Входные данные представлены в файле следующим образом.

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

Требуется выбрать для каждой ячейки один багаж, который удалось оставить в данной ячейке, чтобы сумма времени хранения всех выбранных багажей была максимальной и не кратной 13.

В ответе запишите одно число: найденную сумму.

Пример входного файла:

2

5

30 60

40 1000

59 60

61 1000

1010 1440

Вложения к задаче
Показать ответ и решение
f = open(’26-2.txt’)
k = int(f.readline()) # Kоличество ячеек
n = int(f.readline()) # Kоличество пассажиров

# Сортировка пассажиров по времени сдачи багажа
a = sorted([list(map(int, i.split())) for i in f])
cell = [[] for i in range(k)] # Cписок ячеек
for i in a: # Для каждой заявки пассажира
    for j in range(k): # Ищем свободную ячейку
        # Если ячейка пустая или успеет освободиться
        if (not cell[j]) or (i[0] > cell[j][-1][1]):
            cell[j].append(i) # Добавляем заявку в ячейку
            break # Останавливаем поиск

# Вычисляем длительность каждого хранения багажа в ячейках
t = [[j[1]-j[0] for j in i] for i in cell]
s = 0 # Сумма всех длительностей
mr = 1000050000 # Минимальная разница
for i in t: # Проходим по каждой ячейке
    line = sorted(i, reverse=True) # Сортировка длительностей по убыванию
    s += line[0] # Добавление максимальной длительности к общей сумме
    if len(line) > 1: # Если в ячейке больше одной длительности
        for j in range(1, len(line)): # Ищем минимальную разницу не кратную 13
            if (line[0]-line[j] < mr) and ((line[0]-line[j]) % 13 !=0):
                mr = line[0]-line[j] # Обновляем минимальную разницу
if s % 13 == 0:
    s = s - mr
print(s)

Ответ: 29262

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26.txt’)
n = int(f.readline())
k = int(f.readline())
a = sorted([list(map(int, i.split())) for i in f])
ch = [[] for i in range(k)] # Список с ячейками для хранения багажа
mx_kr_53 = -1
c53 = [-1]*53 # Максимальные времена стирки пассажиров с различными остатками от деления на 53
for i in a: # Перебор пассажиров
    for j in range(k): # Проход по ячейкам в поисках свободной
        if (not ch[j]) or (i[0] > ch[j][-1][1]):
            ch[j].append(i) # Добавляем багаж в ячейку
            tim = i[1]-i[0] # Время хранения багажа
            if tim % 53 == 0: # Для чисел, кратных 53, сохраняем 2 максимальных числа
                if tim >= mx_kr_53:
                    c53[0] = mx_kr_53
                    mx_kr_53 = tim
                elif tim > c53[0]:
                    c53[0] = tim
            elif tim > c53[tim % 53]:
                c53[tim % 53] = tim # Подсчитываем это время хранения
            break # Переходим к следующему пассажиру

if c53[0] != -1 and mx_kr_53 != -1:
    mx_ans = c53[0]+mx_kr_53
for i in range(1, 27):
    if c53[i] + c53[53-i] > mx_ans and c53[i] != -1 and c53[53-i] != -1:
        mx_ans = c53[i] + c53[53-i]
print(mx_ans)

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