Информационный выигрыш по въездам парковки

тема: Энтропия, Gini и сплит · уровень: средний

Условие

На парковке торгового центра для каждого автомобиля сохранены номер въезда и признак того, покинул ли автомобиль парковку в течение часа после въезда. Признак равен 1, если автомобиль выехал в течение часа, и 0 иначе.

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

Энтропия группы с долями классов p0 и p1 определяется формулой H = -p0·log2(p0) - p1·log2(p1). Слагаемое вида 0·log2(0) считается равным 0. Информационный выигрыш равен IG = H(S) - |L|/|S|·H(L) - |R|/|S|·H(R), где S — все записи, L — левая группа, R — правая группа. Энтропия пустой группы считается равной 0, а её вклад в формулу также равен 0.

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

Формат ввода

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

В следующих n строках даны два целых числа gate и fast: номер въезда и признак быстрого выезда для одной записи.

В следующей строке дано целое число q — количество номеров въездов в запросе.

В последней строке даны q целых чисел — номера въездов, образующих левую группу.

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

Выведите одно число — информационный выигрыш разбиения. Число необходимо вывести ровно с тремя знаками после десятичной точки.

Ограничения

1 ≤ n ≤ 2000.

1 ≤ gate ≤ 10000.

fast равно 0 или 1.

1 ≤ q ≤ 2000.

Каждый номер въезда в запросе находится в диапазоне от 1 до 10000.

Входные записи могут иметь одинаковые номера въездов. Номер из запроса может не встретиться ни в одной записи.

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

Куда дальше