Минимальная стоимость после купонов
Условие задачи
Дан список цен товаров prices, количество купонов k и размер скидки x.
Каждый купон можно применить к одному товару. Один купон уменьшает цену выбранного товара на x, но цена не может стать отрицательной. Купоны можно применять к одному и тому же товару несколько раз.
Верните минимальную сумму денег, которую придется заплатить за все товары после применения не более k купонов.
Сигнатура
def min_total_after_coupons(prices: list[int], k: int, x: int) -> int:Ваше решение
Идея решения
Жадность состоит из двух фаз.
Сначала выгодно применять купоны к полным блокам размера x: если товар стоит a, то можно применить a // x купонов и уменьшить цену без выбора между товарами. Ограничиваем это число оставшимся k.
После этой фазы все остатки меньше x. Каждый следующий купон может занулить один остаток, поэтому нужно выбрать самые большие остатки и занулить их первыми.
Если купонов после первой фазы больше или равно числу оставшихся положительных товаров, ответ равен нулю.
