Подсчёт необходимого количества бочонков для полной откачки последовательных резервуаров

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

Условие

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

Дана последовательность объёмов резервуаров и объём бочонка, требуется вычислить, сколько бочонков понадобится, чтобы опустошить все резервуары.

Пример: Резервуары: 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).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее