7.5. Задача «Количество призов»

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

Ключевые вопросы параграфа

  • Как спланировать последовательность наград, чтобы максимизировать число получателей?
  • Почему здесь работает жадный подход и как доказать его корректность?
  • Как использовать свойства суммы арифметической прогрессии при решении алгоритмических задач?

algosy

Нестандартная задача и жадный алгоритм

Вы занимаетесь организацией соревнований для детей, и у вас есть конфет, которые собираетесь раздать в качестве призов. Вы хотите отдать эти конфеты тем, кто займёт первые мест в соревнованиях, и распределить конфеты так, чтобы за более высокое место всегда выходило больше конфет. Чтобы порадовать как можно больше детей, вам понадобится найти самое большое значение , при котором это возможно.

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

Пример 1

Ввод

Вывод

6

3
1 2 3

Пример 2

Ввод

Вывод

8

3
1 2 5

Пример 3

Ввод

Вывод

2

1
2

Упражнение

Можно ли представить 8 как сумму четырёх неповторяющихся положительных целых чисел?

Нетрудно понять, что ответ на этот вопрос: «Нет». Предположим, что и . Тогда , , и . Однако тогда .

По этой же причине, если равно сумме неповторяющихся положительных целых чисел , то . Верно и обратное: если , то можно представить как сумму неповторяющихся целых чисел.

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

Алгоритм состоит в нахождении самого большого значения , при котором .

Время выполнения — или .

Что дальше

Теперь вы умеете применять жадные алгоритмы для распределения ограниченного ресурса и знаете, в каких случаях такая стратегия приводит к оптимальному решению.

Далее — финальная задача главы. Она покажет, что даже на собеседовании можно столкнуться с подводными камнями жадной стратегии: чтобы получить максимальный «оклад», придётся сравнивать не числа, а строки.

А пока вы не ушли дальше — закрепите материал на практике:

  • Отметьте, что урок прочитан, при помощи кнопки ниже.
  • Пройдите мини-квиз, чтобы проверить, насколько хорошо вы усвоили тему.
  • Перейдите к задачам этого параграфа и потренируйтесь.
  • Перед этим — загляните в короткий гайд о том, как работает система проверки.

Хотите обсудить, задать вопрос или не понимаете, почему код не работает? Мы всё предусмотрели — вступайте в сообщество Хендбука! Там студенты помогают друг другу разобраться.

Ключевые выводы параграфа

  • Жадные алгоритмы хорошо работают в задачах распределения, когда нужно покрыть максимум с минимальными затратами.
  • Иногда достаточно отсортировать входные данные и обрабатывать их по порядку — это уже даёт оптимальный результат.
  • Простые стратегии требуют точной формулировки и аккуратной реализации — особенно при работе с ограничениями.
Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф7.4. Задача «Сбор подписей»
Следующий параграф7.6. Задача «Максимальный оклад»