Программа курса:
Разбор задачи: Лодки для спасения людей
Предложенный нами код:
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Логика решения
Сортировка массива по весу
people.sort()Сначала массив
peopleсортируется. Это позволяет нам удобно работать с самыми легкими и самыми тяжелыми людьми, начиная с двух крайних концов массива. Легкий человек находится в начале массива, тяжелый — в конце.Инициализация указателей и счетчика
i, j = 0, len(people) - 1 boats = 0Здесь:
i— указатель на самого легкого человека.j— указатель на самого тяжелого человека.boats— счетчик лодок, который мы будем увеличивать при каждой итерации.
Основной цикл
while i <= j:Цикл продолжается, пока указатель на легкого человека (
i) не пересечется с указателем на тяжелого (j).Проверка, можно ли поместить двоих в одну лодку
if people[i] + people[j] <= limit: i += 1Если веса легкого и тяжелого человека суммарно не превышают
limit, мы помещаем их в одну лодку:- Легкий человек отправляется в лодку, указатель
iсдвигается вправо.
- Легкий человек отправляется в лодку, указатель
Добавление в лодку тяжелого человека
j -= 1 boats += 1В любом случае тяжелый человек всегда занимает место в лодке:
- Указатель
jсдвигается влево. - Счетчик лодок увеличивается.
- Указатель
Возврат результата
После завершения цикла возвращается общее количество лодок: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
- Сортировка:
people = [1, 2] - Указатели:
i = 0,j = 1,boats = 0 - Проверяем:
1 + 2 <= 3→ Да, оба помещаются в одну лодку. - Сдвиг указателей:
i = 1,j = 0,boats = 1 - Результат:
boats = 1
Пример 2:
people = [3, 2, 2, 1]
limit = 3
- Сортировка:
people = [1, 2, 2, 3] - Указатели:
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.
- Проверяем:
- Результат:
boats = 3.