Начинающему админу Ване для тренировки выдали аппарат для сварки оптоволокна и кусков оптоволокна, из которых попросили получить цельные куски по
метров. С целью снижения затухания сигнала в полученном кабеле нужно минимизировать количество сварок. Да и работы меньше. Укажите в ответе два числа: сколько цельных кусков получится и какова длина оставшейся части. Ваня выбирал куски строго по уменьшению длины, за исключением последнего, который выбирался исходя из минимизации длины каждого обрезка. Обрезок идет обратно в пучок кусков для следующего использования.
Входные данные
В первой строке входного файла записаны значения (количество кусков оптоволокна) и
(длина необходимого цельного куска). Каждая из следующих
строк содержит одно целое число – длину очередного куска.
Выходные данные
Два числа: количество сварок в цельных кусках и количество кусков, из которых не сварить цельный кусок требуемой длины.
Пример входного файла:
Сперва взяли и
, обрез
обратно в кучу
– один кусок и 1 сварка. Затем взяли
,
и
, обрез длиной
обратно в кучу
– еще один цельный кусок и 2 сварки. И затем взяли
,
,
и
, ровно
, без обреза – еще кусок и 3 сварки. Осталось
Итого:
сварок и
— количество оставшихся кусков, из которых не сварить цельный кусок нужной длины.
f = open(r"C:\Users\ТимофейDesktop\n2.txt")
n, dl = map(int, f.readline().split())
a = [int(x) for x in f.readlines()]
a.sort(reverse=True)
kolvo_svarok = 0
k = 0
while sum(a) >= dl:
s = 0
# собираем максимальные куски, кроме последнего
while s + a[0] < dl:
s += a[0]
a.pop(0)
kolvo_svarok += 1
kolvo_svarok -= 1 # первый элемент мы не привариваем, а просто "берем в руки"
# начинаем искать кусок, который дает минимальный обрезок
ind = 0
while ind < len(a) and s + a[ind] >= dl:
ind += 1
ind -= 1 # уменьшаем на один, потому что после while ind указывал на
# предмаксимальный элемент, который можно добавить
if s + a[ind] > dl:
a.append(s + a[ind] - dl) # добавляем обрезок
kolvo_svarok += 1
a.pop(ind)
k += 1
a.sort(reverse=True)
# в массиве a остались только куски, из которых не собрать цельный кусок (т.к. sum(a) < dl)
print(kolvo_svarok, len(a))