F-мера отбора призёров забега

тема: Метрики классификации · уровень: продвинутый

Условие

На школьной спартакиаде система заранее отмечает участников забега, которых считает возможными призёрами. После забега известен фактический результат: призёром считается участник с меткой 1, остальные имеют метку 0.

Для каждого участника дана фактическая метка и прогноз системы. Прогноз 1 означает, что система отметила участника как возможного призёра, 0 означает, что не отметила, а - означает пропуск прогноза. Пропуск прогноза следует считать прогнозом 0.

Необходимо для каждого запрошенного значения параметра beta вычислить F-меру с параметром beta. Пусть TP — число участников с фактической меткой 1 и прогнозом 1, FP — число участников с фактической меткой 0 и прогнозом 1, FN — число участников с фактической меткой 1 и прогнозом 0 или -. Тогда

F_beta = ((1 + beta^2) * TP) / ((1 + beta^2) * TP + beta^2 * FN + FP).

Если знаменатель формулы равен нулю, значение F-меры считается равным 0. При равенстве нескольких значений параметра beta они считаются отдельными запросами, а ответы выводятся в порядке запросов.

Формат ввода

В первой строке дано целое число n — количество участников забега.

В следующих n строках даны три значения: идентификатор участника, фактическая метка призёра и прогноз системы.

Затем дано целое число q — количество запросов.

В следующих q строках дано по одному целому числу beta — параметру F-меры для очередного запроса.

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

Выведите q строк. В строке с номером запроса выведите соответствующее значение F_beta с тремя знаками после точки.

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

Ограничения

1 <= n <= 4000.

1 <= q <= 1000.

Идентификатор участника состоит из латинских букв, цифр и символа _, его длина от 1 до 20 символов.

Фактическая метка равна 0 или 1.

Прогноз системы равен 0, 1 или -.

1 <= beta <= 100.

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

Куда дальше