Вася решил разработать плагин для нового мессенджера Min. Плагин должен определять, является ли приходящее сообщение фродом (то есть, что оно написано мошенниками). Вася уже почти выполнил работу и реализовал алгоритм, который для каждого сообщения выдаёт оценку P. Чем больше эта оценка, тем выше вероятность, что сообщение является фродом. Осталась последняя деталь — необходимо определить порог срабатывания, то есть начиная с какого порогового значения T сообщения с оценкой P ≥ T алгоритм будет считать фродом.
Для решения этой задачи Вася сформировал обучающую выборку из N сообщений и привлёк в качестве экспертов своих одноклассников. Они прочитали эти N сообщений и отметили, какие из них — фрод. Все остальные сообщения фродом не являются.
Для оценки качества алгоритма Вася решил использовать метрику F1. Поясним, как она вычисляется. Введём следующие обозначения:
Тогда значения precision (точность) и recall (полнота) вычисляются по формулам:
precision = TP / (TP + FP), то есть какая доля сообщений, которые наш алгоритм назвал фродом, действительно фрод.
recall = TP / (TP + FN), то есть какую долю фрод-сообщений среди всех фрод-сообщений нашёл наш алгоритм.
Метрика F1 вычисляется по формуле:
Примечание. В случае, когда precision и recall одновременно равны нулю, результирующая метрика F1 тоже равна нулю.
Чем больше значение метрики F1, тем выше качество классификации. Найдите такое натуральное число — значение порога T, которое даст максимальное значение F1.
В первой строке входных данных записано число N (1 ≤ N ≤ 105) — общее количество сообщений.
Во второй строке перечислены N натуральных чисел через пробел в диапазоне от 1 до 109 — значения оценки P для каждого сообщения.
В третьей строке находится число K (1 ≤ K ≤ N) – количество фрод-сообщений.
В четвертой строке перечислены K различных целых чисел в диапазоне от 1 до N в произвольном порядке — номера фрод-сообщений.
Выведите одно натуральное число – значение порога T, при котором достигается наибольшеее значению метрики F1. Если есть несколько верных ответов, то выведите наименьший.
5
1 2 3 4 5
3
1 4 3
1
10
1 2 3 4 5 6 7 8 100 1000
1
9
9
Примечание для пишущих на языке Python. Ввести набор записанных через пробел целых чисел можно так:
a = [int(x) for x in input().split()]
Система оценивания.
Подзадача 1 (до 60 баллов): N ≤ 100.
Подзадача 2 (до 40 баллов): N ≤ 105.