Команда из лучших

тема: Обмен и назначение · уровень: базовый

Условие

В школе выбирают команду на турнир. У каждого ученика есть «рейтинг полезности» — неотрицательное целое число. Учитель хочет взять ровно k учеников так, чтобы суммарный рейтинг команды был как можно больше.

Нужно узнать, какой максимальной может быть сумма.

Важно: на олимпиадах сумма может не помещаться в 32-битный тип (используйте 64-битные целые; в Python это не проблема).

Формат ввода

В первой строке записаны два целых числа n и k. Во второй строке записаны n целых чисел a1, a2, ..., an — рейтинги учеников.

Формат вывода

Выведите одно число — максимальную возможную сумму рейтингов выбранных k учеников.

Ограничения

Пример

Ввод:

5 2
1 100 2 99 3

Вывод:

199

В этом примере выгодно взять учеников с рейтингами 100 и 99.

Как решать — идея подхода

Приём: Жадный выбор + сортировка

Ключевое наблюдение: если у тебя уже выбраны k учеников, и среди выбранных есть кто-то с рейтингом x, а среди невыбранных есть рейтинг y > x, то заменой x на y сумма строго увеличится. Значит, в оптимальном наборе не может быть «пропущенного» большего числа — нужно брать самые большие значения.

Почему работает жадность: цель — максимальная сумма без дополнительных ограничений (не важны позиции, совместимость и т.п.). Поэтому любой выбор можно улучшать локальными заменами, пока не останутся k максимальных рейтингов.

План решения:

Сложность: сортировка занимает O(n log n), суммирование первых k — O(k). При n до 3000 это легко проходит.

Частая ошибка: сортировать по возрастанию и случайно суммировать первые k (получится минимум). Если сортируешь по возрастанию, тогда бери последние k: sum(a[n-k:]).

Разберись руками

Есть 5 учеников с рейтингами: 1, 100, 2, 99, 3. Нужно выбрать ровно 2 учеников так, чтобы сумма рейтингов была максимальной.

Идея: Чтобы сумма была как можно больше, выбирай рейтинги по убыванию: сначала самый большой, потом следующий самый большой, и так пока не наберёшь нужное количество. Потом сложи выбранные числа.

Решить задачу с автопроверкой на Python →

Куда дальше