Очередь с приоритетами Python: выбор максимума с учётом срока жизни

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Heapq и bisect в Python: задачи на кучи и приоритетные очереди.

Конденсатор рунических искр

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

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

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

Что уже дано

Готовая заготовка считывает данные из стандартного потока ввода, формирует список раундов с действиями, вызывает функцию total_spark_damage и выводит результат на экран.

Что нужно сделать

Реализуйте функцию total_spark_damage(rounds: list[list[tuple]]) -> int.

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

  • ("ADD", charge, lifetime) — добавление в конденсатор новой искры с зарядом charge и временем жизни lifetime (искра сразу доступна для последующих действий этого же раунда);
  • ("FIRE",) — активация конденсатора.

Правила обработки событий:

  • Перед началом первого раунда конденсатор пуст.
  • Внутри каждого раунда действия выполняются строго по порядку.
  • При операции FIRE из конденсатора извлекается и расходуется ровно одна не угасшая искра с максимальным зарядом. Если таких искр несколько, выбирается искра с наименьшим оставшимся временем жизни. Если совпадает и оно, выбирается искра, добавленная раньше. Заряд выбранной искры добавляется к суммарному урону.
  • Если во время FIRE в конденсаторе нет доступных живых искр, заклинание не срабатывает, урон не увеличивается, а партия продолжается.
  • Строго после завершения всех действий текущего раунда оставшееся время жизни каждой неизрасходованной искры уменьшается на единицу. Искры, у которых запас раундов становится равен нулю, окончательно рассеиваются и больше не могут быть использованы.

Функция должна вернуть одно целое неотрицательное число — суммарный урон от всех успешно израсходованных искр за всю партию.

Ввод и вывод

Программа взаимодействует с пользователем через стандартные потоки stdin и stdout.

Формат ввода

  • В первой строке задано целое число — количество раундов ().
  • Далее следуют блоки описания каждого раунда: сначала строка с целым числом — количеством действий в раунде, затем строк с самими операциями.
  • Каждая операция задаётся строкой ADD charge lifetime () либо строкой FIRE. Суммарное количество всех действий за партию не превышает 8000.

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

Одна строка с единственным целым неотрицательным числом — суммарным уроном от зарядов всех успешно активированных искр.

Пример

Ввод
3
3
ADD 5 3
ADD 5 1
FIRE
3
FIRE
ADD 9 1
FIRE
1
FIRE
Вывод
19
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи