Объединение команд и подсчёт рейтинга на Python
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.
Командный турнир настольного фехтования
На турнире по настольному фехтованию соревнуются клубы, объединяющие бойцов разного мастерства. Ранг каждого участника неизменен с самого начала. Бойцы сходятся в дуэлях, и каждая победа пополняет личный счёт участника, а поражения не отнимают уже заработанные очки.
Ход турнира состоит из двух типов событий: поединков и слияний действующих гильдий. Когда две гильдии объединяются, одна передаёт другой всех своих фехтовальщиков с их накопленными победами и покидает турнир. Сохранившееся объединение берёт себе то имя из двух прежних названий, которое идёт раньше по алфавиту.
Успех гильдии оценивают только по её сильнейшим бойцам: в командный зачёт идут накопленные победы лишь тех участников, чей ранг равен высшему рангу внутри этой гильдии на данный момент. Определите, какая гильдия удерживает лидерство по очкам зачёта после каждого турнирного события.
Что уже дано
Предоставленная заготовка считывает из потока ввода числа n и q, формирует список кортежей fighters вида (fighter, guild, rank) и сохраняет список событий events, где каждое событие представлено списком из трёх строк. Никаких скрытых файлов или предварительно вычисленных значений в программе нет.
Что нужно сделать
Допишите основной скрипт, чтобы последовательно обработать все события из events и после каждого из них вывести текущего лидера.
Правила турнира:
- В начале у каждого фехтовальщика 0 побед, а его ранг остаётся постоянным до конца турнира.
- Активными вначале считаются все гильдии, указанные у фехтовальщиков.
- При событии
DUEL winner loserбоецwinnerполучает 1 победу. Победыloserне уменьшаются. Фехтовальщики могут принадлежать одной и той же гильдии. - При событии
MERGE guild1 guild2объединяются две действующие гильдии. Выживает гильдия, чьё имя лексикографически меньше, независимо от порядка аргументов. Все бойцы упраздняемой гильдии вместе со всеми накопленными победами переходят в выжившую гильдию, а упразднённая гильдия окончательно исчезает из турнира и больше не встречается в событияхMERGE. - Очки активной гильдии считаются строго независимо от остальных: найдите максимальный ранг среди её текущих участников и просуммируйте накопленные победы бойцов только этого ранга. Очки бойцов более низких рангов в зачёт не идут.
- Лидером становится активная гильдия с наибольшим количеством очков зачёта. Если у нескольких гильдий максимальное количество очков совпадает, лидером признаётся гильдия с лексикографически наименьшим именем. Учитываются в том числе нулевые результаты.
Ввод и вывод
Программа взаимодействует с проверяющей системой через стандартные потоки stdin и stdout.
Формат ввода
Первая строка содержит два целых числа: n (количество бойцов, от 1 до 30) и q (количество событий, от 0 до 100).
Следующие n строк содержат данные бойцов через пробел: имя фехтовальщика, название гильдии и целочисленный ранг от 1 до 100. Имена бойцов и названия гильдий состоят из 1–12 строчных латинских букв (ASCII a-z) без пробелов. Имена бойцов уникальны; названия гильдий могут повторяться, если в клубе состоит несколько бойцов.
Следующие q строк содержат описания событий. Все входные события гарантированно корректны, обработка ошибок ввода не требуется:
DUEL winner loser— поединок между двумя различными существующими бойцамиwinnerиloser.MERGE guild1 guild2— объединение двух различных текущих активных гильдийguild1иguild2.
Формат вывода
Выведите ровно q строк в порядке наступления событий. Каждая строка должна содержать имя гильдии-лидера и её текущий командный счёт, разделённые пробелом. Если q = 0, вывод должен оставаться пустым.
Пример
- Ввод
4 5 ira oak 3 leo oak 1 mia ash 2 noa elm 3 DUEL mia ira DUEL leo noa MERGE oak ash DUEL ira noa DUEL noa ira
- Вывод
ash 1 ash 1 ash 0 ash 1 ash 1
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Удаление ключа из ChainMap в Python: проверка поведения del
- Обратный индекс на Python: группировка уникальных значений через defaultdict
- Подсчёт дефицита ресурсов в Python: квоты и суммы заявок
- ChainMap в Python: исправьте приоритет настроек и удаление переопределений
- Иерархия конфигурации в Python: изоляция настроек разных клиентов
- Скользящее окно Python: найдите кратчайшую подстроку с тремя символами
