Разбор задачи: Лодки для спасения людей

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

 def numRescueBoats(people, limit):
    # Сортируем массив людей по весу
    people.sort()
    
    # Два указателя: i — начало, j — конец массива
    i, j = 0, len(people) - 1
    boats = 0  # Счетчик лодок
    
    while i <= j:
        # Если самый легкий и самый тяжелый человек вместе умещаются в лодку
        if people[i] + people[j] <= limit:
            i += 1  # Легчайший человек сел в лодку
        j -= 1  # Тяжелый человек сел в лодку
        boats += 1  # Увеличиваем счетчик лодок
    
    return boats

Логика решения

  1. Сортировка массива по весу

    people.sort()
    

    Сначала массив people сортируется. Это позволяет нам удобно работать с самыми легкими и самыми тяжелыми людьми, начиная с двух крайних концов массива. Легкий человек находится в начале массива, тяжелый — в конце.

  2. Инициализация указателей и счетчика

    i, j = 0, len(people) - 1
    boats = 0
    

    Здесь:

    • i — указатель на самого легкого человека.
    • j — указатель на самого тяжелого человека.
    • boats — счетчик лодок, который мы будем увеличивать при каждой итерации.
  3. Основной цикл

    while i <= j:
    

    Цикл продолжается, пока указатель на легкого человека (i) не пересечется с указателем на тяжелого (j).

  4. Проверка, можно ли поместить двоих в одну лодку

    if people[i] + people[j] <= limit:
        i += 1
    

    Если веса легкого и тяжелого человека суммарно не превышают limit, мы помещаем их в одну лодку:

    • Легкий человек отправляется в лодку, указатель i сдвигается вправо.
  5. Добавление в лодку тяжелого человека

    j -= 1
    boats += 1
    

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

    • Указатель j сдвигается влево.
    • Счетчик лодок увеличивается.
  6. Возврат результата
    После завершения цикла возвращается общее количество лодок:

    return boats
    

Разбор фрагментов кода

Сортировка

people.sort()

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


Указатели и цикл

i, j = 0, len(people) - 1
while i <= j:
  • i и j задают диапазон людей, которых мы еще не распределили по лодкам.
  • Цикл работает, пока диапазон не станет пустым (указатели пересекутся).

Проверка на вместимость двоих

if people[i] + people[j] <= limit:
    i += 1

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


Добавление лодки

j -= 1
boats += 1

Тяжелый человек отправляется в лодку всегда, даже если его вес превышает допустимый в паре с легким человеком. Количество лодок увеличивается.


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

Пример 1:

people = [1, 2]
limit = 3
  1. Сортировка: people = [1, 2]
  2. Указатели: i = 0, j = 1, boats = 0
  3. Проверяем: 1 + 2 <= 3 → Да, оба помещаются в одну лодку.
  4. Сдвиг указателей: i = 1, j = 0, boats = 1
  5. Результат: boats = 1

Пример 2:

people = [3, 2, 2, 1]
limit = 3
  1. Сортировка: people = [1, 2, 2, 3]
  2. Указатели: i = 0, j = 3, boats = 0
    • Проверяем: 1 + 3 > 3 → Только тяжелый человек отправляется в лодку.
      Сдвиг: j = 2, boats = 1.
    • Проверяем: 1 + 2 <= 3 → Оба помещаются в лодку.
      Сдвиг: i = 1, j = 1, boats = 2.
    • Проверяем: 2 + 2 > 3 → Только тяжелый человек отправляется в лодку.
      Сдвиг: j = 0, boats = 3.
  3. Результат: boats = 3.

 



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