Муниципальный этап ВсОШ 2025, профиль ИИ, 7-8 и 9-11 классы, Вологодская область
1. Матрица ошибок
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

При оценке качества бинарной классификации часто используют матрицу ошибок (Confusion matrix). Поясним, что это такое. Пусть у нас есть $$$N$$$ каких-то объектов, относящихся к одному из двух классов (0 или 1). Например, объекты — это рентгеновские снимки, класс 1 означает, что пациент болен, класс 0 — что здоров. Пусть имеется некоторый алгоритм, который по объекту предсказывает его класс. Зная фактические и предсказанные классы, для оценки качества предсказания можно построить следующую таблицу:

Предсказанный класс = 1Предсказанный класс = 0
Фактический класс = 1TPFN
Фактический класс = 0FPTN

Здесь значение TP (True Positive) — это количество объектов, для которых модель предсказала класс 1, и у них на самом деле класс 1. Значение TN (True Negative) — количество объектов, для которых модель предсказала класс 0, и у них на самом деле класс 0. Значение FP (False Positive) — количество объектов, для которых модель предсказала класс 1, а на самом деле у них класс 0. Значение FN (False Negative) — количество объектов, для которых модель предсказала класс 0, а на самом деле у них класс 1.

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

Точность (precision) вычисляется по формуле $$$precision = TP / (TP + FP)$$$, то есть какая доля объектов, которые наш алгоритм отнёс к классу 1, действительно относится к классу 1.

Полнота (recall) вычисляется по формуле $$$recall = TP / (TP + FN)$$$, то есть какую долю объектов класса 1 среди всех объектов класса 1 нашёл наш алгоритм.

Пусть всего было 99 объектов, из них 35 — класса 0 и 64 — класса 1. Известно, что модель правильно определила класс для 51 объекта. Найдите ответы на следующие четыре вопроса.

  1. Какая максимальная точность могла получиться?
  2. А какая минимальная?
  3. Пусть дополнительно известно, что точность оказалась равна полноте. Какая максимальная полнота при этом могла получиться?
  4. А какая минимальная?

В ответ запишите четыре вещественных числа, каждое в отдельной строке. В качестве разделителя дробной части используйте точку. Если вы не знаете каких-то ответов, напишите вместо них нули. Гарантируется, что все числа в ответе имеют конечную дробную часть. В поле "Язык" выберите PHP (вам не нужно знать этот язык, это просто особенность проверяющей системы) и нажмите кнопку "Отослать".

Примечание

Система оценивания: каждый верный ответ оценивается в 25 баллов.

2. Результаты олимпиады
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Вам дана таблица с данными о проверке решений участников некоторой олимпиады по информатике: log.csv. Копия этой таблицы также находится здесь: log.csv.

Таблица имеет 4 столбца: problem — номер задачи (от 1 до 5); userId — идентификатор участника; language — язык программирования; score — баллы, которое набрало решение (от 0 до 100). Значения score также могут быть пустыми (если, например, какие-то решения даже не скомпилировалось на сервере).

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

Проанализируйте данные в таблице и ответьте на следующие 4 вопроса.

  1. Сколько участников набрали больше нуля баллов?
  2. Сколько участников все свои решения отправили на языке Python?
  3. Сколько участников набрали не менее 200 баллов?
  4. Сколько участников, набравших не менее 200 баллов, хотя бы одно решение отправили на языке C++?

В ответе напишите 4 целых числа, каждое в отдельной строке. Не пишите ничего лишнего. Если вы не знаете каких-то ответов, напишите вместо них нули. В поле "Язык" выберите PHP (вам не нужно знать этот язык, это просто особенность проверяющей системы) и нажмите кнопку "Отослать".

Примечание

Каждый верный ответ оценивается в 25 баллов.

3. Верный диагноз
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Известная медицинская клиника решила добавить в свой список услуг лечение опасной болезни под названием «Воспаление хитрости». Но, прежде чем лечить болезнь, её необходимо диагностировать. Для этого клиника заказала у трёх медицинских лабораторий разработку тест-систем для выполнения диагностики. Через некоторое время лаборатории предоставили свои результаты.

Известно, что при своей работе все тест-системы используют разные технологии и разные алгоритмы для выявления болезни. Поэтому в этой задаче будем считать их диагнозы независимыми друг от друга (примечание: на практике некоторая зависимость всё равно бы имелась, но здесь её будем игнорировать).

Первая тест-система ставит верный диагноз с вероятностью $$$p_1$$$, вторая — с вероятностью $$$p_2$$$, третья — с вероятностью $$$p_3$$$. Окончательное решение принимается по большинству результатов. То есть, если любые две или все три тест-системы решили, что пациент болен, то он считается больным, в противном случае — нет. Определите, с какой вероятностью клиника будет ставить верные диагнозы.

Входные данные

Вводятся три вещественных числа $$$p_1$$$, $$$p_2$$$, $$$p_3$$$, каждое в отдельной строке ($$$0.5 \le p_1, p_2, p_3 \le 1$$$).

Выходные данные

Выведите одно вещественное число — итоговую вероятность верного диагноза. Абсолютная или относительная погрешность ответа не должна превышать $$$10^{-4}$$$.

Пример
Входные данные
0.65
0.7
0.9
Выходные данные
0.851

4. Меры центральной тенденции
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Меры центральной тенденции — это статистические показатели, которые описывают «типичное» или центральное значение в наборе данных. Существует несколько таких мер, рассмотрим три из них.

Медианой набора чисел нечётной длины называется элемент, который окажется в середине, если числа отсортировать. Мода — это самый часто встречающийся элемент. Мод может быть несколько. Среднее арифметическое — это сумма всех элементов, делённая на их количество.

Напишите программу, находящую набор из пяти целых чисел, для которого выполняются одновременно следующие три условия:

  1. мода равна $$$x$$$, и она единственная;
  2. медиана равна $$$y$$$;
  3. среднее арифметическое равно $$$z$$$.
Входные данные

Вводятся три целых числа $$$x$$$, $$$y$$$ и $$$z$$$, каждое в отдельной строке ($$$0 \le x, y, z \le 10^8$$$).

Выходные данные

Выведите пять целых чисел, имеющих указанные моду, медиану и среднее. Числа должны быть в диапазоне от $$$-10^9$$$ до $$$10^9$$$. Если есть несколько верных ответов, выведите любой. Если решений нет, выведите одно число -1.

Примеры
Входные данные
1
2
5
Выходные данные
1 9 1 2 12
Входные данные
1
3
2
Выходные данные
-1
Примечание

Решения, верно работающие при $$$x, y, z \le 10$$$, будут оценены в 50 баллов.

5. Ближайшие соседи
ограничение по времени на тест
1.5 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Даны $$$n$$$ точек на плоскости. Каждая точка имеет координаты $$$x_i$$$, $$$y_i$$$ и цвет $$$c_i$$$, который может быть белый ($$$c_i=0$$$) или чёрный ($$$c_i=1$$$).

Чтобы определить цвет новой точки $$$P$$$, если он неизвестен, может использоваться следующий подход. Берутся $$$k$$$ наиболее близких к ней наших точек (где $$$k$$$ — некоторое нечётное число), и выбирается тот цвет, который встречается среди них чаще. Примечание: меру близости двух точек можно вычислять по разному, в данной задаче используется обычное евклидово расстояние (то есть длина отрезка между точками).

Качество работы такого классификатора зависит от выбора параметра $$$k$$$. Чтобы найти хорошее значение $$$k$$$, можно использовать следующий простой способ. Посмотрим, какие ответы при разных $$$k$$$ будут получаться для наших входных точек (для которых заранее известны правильные ответы), и выберем то значение $$$k$$$, при котором правильных ответов будет наибольшее количество. Такой метод называется «LOO-кросс-валидация».

Поясним работу этого метода подробнее. Переберём все нечётные значения $$$k$$$ в диапазоне от $$$1$$$ до $$$n-1$$$. Для каждого такого $$$k$$$ переберём все точки. Для каждой из них найдём $$$k$$$ ближайших к ней других точек (её саму не учитываем), возьмём цвет, который встречается среди них чаще, и сравним его с настоящим цветом этой точки. Чем больше верных ответов получилось для текущего значения $$$k$$$, тем это значение лучше. Разумеется, для повышения эффективности можно изменить описанную реализацию алгоритма — главное, чтобы при этом результаты остались правильными.

Напишите программу, которая для каждого нечётного $$$k$$$ в диапазоне от 1 до $$$n$$$ определит, для скольких точек будет верно определён цвет при данном $$$k$$$ в ходе LOO-кросс-валидации.

Входные данные

В первой строке входных данных записано целое число $$$n$$$ ($$$2 \le n \le 1000$$$).

В следующих $$$n$$$ строках записаны тройки чисел $$$x_i$$$, $$$y_i$$$ и $$$c_i$$$ — координаты очередной точки ($$$-20000 \le x_i, y_i \le 20000$$$) и её цвет $$$c_i$$$ (равный либо 0, либо 1).

Гарантируется, что никакие две точки не совпадают и расстояния между всеми парами точек различны.

Выходные данные

Выведите количество верно классифицированных точек для $$$k=1$$$, $$$k=3$$$, $$$k=5$$$ и так далее до $$$n-1$$$ (а если $$$n-1$$$ чётно, то до $$$n-2$$$). Сами значения $$$k$$$ выводить не нужно.

Пример
Входные данные
4
1 2 0
-3 1 1
0 0 1
4 5 0
Выходные данные
2
0
Примечание

Подзадача 1 (до 30 баллов): $$$n \le 50$$$.

Подзадача 2 (до 30 баллов): $$$n \le 200$$$.

Подзадача 3 (до 40 баллов): $$$n \le 1000$$$.

Примечание для пишущих на языке Python. Ввести три числа через пробел можно так:

x, y, c = [int(x) for x in input().split()]

6. Антифрод
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Вася решил разработать плагин для нового мессенджера Min. Плагин должен определять, является ли приходящее сообщение фродом (то есть, что оно написано мошенниками). Вася уже почти выполнил работу и реализовал алгоритм, который для каждого сообщения выдаёт оценку P. Чем больше эта оценка, тем выше вероятность, что сообщение является фродом. Осталась последняя деталь — необходимо определить порог срабатывания, то есть начиная с какого порогового значения T сообщения с оценкой P ≥ T алгоритм будет считать фродом.

Для решения этой задачи Вася сформировал обучающую выборку из N сообщений и привлёк в качестве экспертов своих одноклассников. Они прочитали эти N сообщений и отметили, какие из них — фрод. Все остальные сообщения фродом не являются.

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

  • TP (True Positive) — количество сообщений, которые алгоритм признал фродом и которые на самом деле — фрод.
  • FP (False Positive) — количество сообщений, которые алгоритм признал фродом, но на самом деле они — не фрод.
  • TN (True Negative) — количество сообщений, которые алгоритм признал не фродом и которые на самом деле — не фрод.
  • FN (False Negative) — количество сообщений, которые алгоритм признал не фродом, но на самом деле они — фрод.

Тогда значения precision (точность) и recall (полнота) вычисляются по формулам:

precision = TP / (TP + FP), то есть какая доля сообщений, которые наш алгоритм назвал фродом, действительно фрод.

recall = TP / (TP + FN), то есть какую долю фрод-сообщений среди всех фрод-сообщений нашёл наш алгоритм.

Метрика F1 вычисляется по формуле:

F1 = 2·precision·recall / (precision + recall)

Примечание. В случае, когда 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.