Буст для популярного поста

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

Условие

У школьного медиа есть пост, который нужно удержать в «популярном» ровно c часов подряд.

Продвижение можно покупать двумя способами:

Пакеты можно покупать сколько угодно. Если продвижения куплено больше, чем нужно, лишние часы просто «сгорают» — это разрешено.

Найдите минимальное количество монет, которое придётся потратить.

Формат ввода

В одной строке даны три целых числа a, b, c.

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

Выведите одно целое число — минимальную стоимость.

Ограничения

Пример

Ввод:

3 10 8

Вывод:

13

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

Приём: Жадный выбор по блокам + сравнение цен

Ключевое наблюдение: покупка продвижения — это сумма независимых «кусочков» по времени. Для каждых 7 часов не важно, что происходит в других местах: вы просто решаете, оплатить их пакетом за b или семью часами по a. То же самое с остатком (меньше 7 часов): его можно добрать по 1 часу или одним лишним пакетом, а лишние часы сгорят.

Почему жадно работает: стоимость линейная, ограничения на число покупок нет, а «сгорание» разрешено. Значит, оптимум получается из локальных минимальных выборов для каждого блока.

План:

Сложность: O(1) по времени и памяти.

Частая ошибка: считать, что пакет на 7 часов можно брать только для «полных» семёрок. На самом деле для остатка тоже нужно сравнить с b, потому что переплата может быть выгоднее, чем докупать по 1 часу.

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

1 час продвижения стоит 3 монеты, а пакет на 7 часов стоит 10 монет. Нужно удержать пост популярным 8 часов подряд, лишние купленные часы могут сгореть. Давай руками найдём минимальную стоимость на этом примере.

Идея: Разбей нужные часы на «полные семёрки» и остаток. Для каждой семёрки выбирай более дешёвый способ: один пакет или 7 одиночных часов. Для остатка снова выбери, что дешевле: добрать одиночными часами или взять ещё один пакет (лишнее можно сжечь). Потом сложи выбранные стоимости.

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

Куда дальше