Последовательно наполняйте текущий бочонок; если следующий объём не помещается, начинайте новый. Если отдельный резервуар больше ёмкости, перелив целиком невозможен.
Подсчёт необходимого количества бочонков для полной откачки последовательных резервуаров
Последовательно наполняйте текущий бочонок; если следующий объём не помещается, начинайте новый. Если отдельный резервуар больше ёмкости, перелив целиком невозможен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
На конвейерной ленте поступают резервуары с жидкостями неотрицательного объёма (порядок их появления менять нельзя). Имеется неограниченное количество бочонков фиксированного положительного объёма, в которые нужно переливать эту жидкость. Каждый резервуар необходимо вылить полностью: если в текущем бочонке не хватает места, берём новый бочонок.
Дана последовательность объёмов резервуаров и объём бочонка, требуется вычислить, сколько бочонков понадобится, чтобы опустошить все резервуары.
Пример: Резервуары: 1 3 2 4 10 8 4 2 5 3 Объём бочонка: 12
Ответ
Последовательно наполняйте текущий бочонок; если следующий объём не помещается, начинайте новый. Если отдельный резервуар больше ёмкости, перелив целиком невозможен.
def count_barrels(volumes, capacity):
if capacity <= 0:
raise ValueError('Нужна положительная ёмкость')
count, load = 0, 0
for volume in volumes:
if volume < 0 or volume > capacity:
raise ValueError('Недопустимый объём резервуара')
if volume == 0:
continue
if count == 0 or load + volume > capacity:
count += 1
load = 0
load += volume
return count
Для примера нужно 4 бочонка. Пустая последовательность и только нулевые объёмы здесь требуют 0 бочонков. Порядок не меняется, сосуд не делится; время O(n), память O(1).