Разбор задачи: Максимальное количество единиц на грузовом автомобиле

Предложенный нами код решения:

 def maximumUnits(boxTypes, truckSize):
    """
    Возвращает максимальное количество единиц, которые можно погрузить на грузовик.
    :param boxTypes: Список типов коробок, каждый элемент представляет [количество коробок, количество единиц в каждой коробке]
    :param truckSize: Максимальное количество коробок, которые можно погрузить на грузовик
    :return: Максимальное количество единиц, которые можно погрузить на грузовик
    """
    # Сортируем коробки по убыванию количества единиц на коробку
    boxTypes.sort(key=lambda x: x[1], reverse=True)
    
    total_units = 0
    for boxes, units in boxTypes:
        if truckSize == 0:
            break
        # Берем столько коробок, сколько можем, но не превышаем вместимость грузовика
        boxes_to_take = min(boxes, truckSize)
        total_units += boxes_to_take * units
        truckSize -= boxes_to_take
        
    return total_units
  1. Инициализация функции: Функция maximumUnits принимает два аргумента:
    • boxTypes: Список, где каждый элемент представляет собой пару [numberOfBoxes, numberOfUnitsPerBox], т.е. количество коробок и количество единиц в каждой коробке.
    • truckSize: Максимальное количество коробок, которые можно погрузить на грузовик.
  2. Описание алгоритма: Алгоритм решает задачу по жадному принципу, т.е. выбирает коробки, которые могут максимально увеличить общее количество единиц, заполняя грузовик.

Шаг 1: Сортировка коробок

boxTypes.sort(key=lambda x: x[1], reverse=True)

Разбор фрагмента:

  • Здесь используется сортировка списка boxTypes. Сортировка происходит по убыванию количества единиц на коробку (второй элемент каждого подсписка).
  • lambda x: x[1] указывает, что сортировать нужно по второму элементу каждого подсписка (количество единиц в коробке).
  • reverse=True означает, что сортировка будет происходить по убыванию, то есть сначала будут идти коробки с наибольшим количеством единиц.

Пример: Если входной список коробок будет таким:

boxTypes = [[1, 3], [2, 2], [3, 1]]

После сортировки он станет:

boxTypes = [[1, 3], [2, 2], [3, 1]]

Коробки с большим количеством единиц окажутся в начале списка.

Шаг 2: Наполнение грузовика

total_units = 0

Разбор фрагмента:

  • Инициализируется переменная total_units, которая будет хранить общее количество единиц, загруженных на грузовик.

Шаг 3: Итерация по коробкам

for boxes, units in boxTypes:
    if truckSize == 0:
        break

Разбор фрагмента:

  • Начинается цикл по всем типам коробок в отсортированном списке.
  • Если на каком-то шаге количество оставшихся коробок (truckSize) становится равным 0, это значит, что грузовик уже полностью загружен, и цикл можно прервать.

Шаг 4: Выбор коробок

boxes_to_take = min(boxes, truckSize)
total_units += boxes_to_take * units
truckSize -= boxes_to_take

Разбор фрагмента:

  • boxes_to_take = min(boxes, truckSize) — на этом шаге мы выбираем минимальное количество коробок между тем, сколько коробок есть у текущего типа, и тем, сколько еще можно положить в грузовик.
  • total_units += boxes_to_take * units — добавляем количество единиц, которое помещается в выбранное количество коробок, к общему числу единиц на грузовике.
  • truckSize -= boxes_to_take — уменьшаем оставшуюся вместимость грузовика на количество выбранных коробок.

Шаг 5: Возвращаем результат

return total_units

Разбор фрагмента:

  • Функция возвращает общее количество единиц, которое удалось загрузить на грузовик.

Пример работы алгоритма

Рассмотрим пример с входными данными:

boxTypes = [[1, 3], [2, 2], [3, 1]]
truckSize = 4

1. Сортировка коробок: После сортировки по количеству единиц на коробку, список boxTypes станет:

[[1, 3], [2, 2], [3, 1]]

2. Заполнение грузовика:

  • Сначала мы выбираем коробки с наибольшим количеством единиц. У нас есть 1 коробка с 3 единицами, и грузовик может взять 4 коробки, так что мы берем эту коробку:
    • total_units = 1 * 3 = 3
    • truckSize = 4 - 1 = 3
  • Далее мы берем 2 коробки с 2 единицами:
    • total_units += 2 * 2 = 7
    • truckSize = 3 - 2 = 1
  • Наконец, мы берем одну коробку с 1 единицей:
    • total_units += 1 * 1 = 8
    • truckSize = 1 - 1 = 0
  • Грузовик полностью заполнен.

3. Результат: Функция возвращает total_units = 8.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии