Ближайший результат после стандартизации

тема: Расстояния и kNN · уровень: продвинутый

Условие

На школьной спартакиаде для каждого участника записаны результат забега в сотых долях секунды и пульс после финиша. В некоторых карточках одно из измерений отсутствует и обозначается NA.

Организаторы получили ЗАПРОС с результатом и пульсом нового участника. Требуется определить ближайшего участника двумя способами: по исходным величинам и после стандартизации признаков z-оценкой.

Пусть для признака j имеются значения у m_j участников. Его среднее и стандартное отклонение определяются формулами μ_j = (x_1 + x_2 + ... + x_mj) / m_j и σ_j = sqrt(((x_1 - μ_j)^2 + ... + (x_mj - μ_j)^2) / m_j). Это генеральное, а не выборочное стандартное отклонение. Для участника i и ЗАПРОСА рассматриваются только признаки, известные у обоих. Если множество таких признаков равно J_i, то исходное расстояние равно d_i = sqrt(Σ по j из J_i (x_ij - q_j)^2), а стандартизованное расстояние равно z_i = sqrt(Σ по j из J_i ((x_ij - q_j) / σ_j)^2).

Если у признака нет известных значений или его стандартное отклонение равно нулю, вклад этого признака в стандартизованное расстояние считается равным нулю. Участник, не имеющий ни одного общего с ЗАПРОСОМ известного признака, не рассматривается. Гарантируется, что существует хотя бы один рассматриваемый участник. При равенстве расстояний выбирается участник, чья строка раньше во входных данных.

Формат ввода

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

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

В последней строке записано слово ЗАПРОС, затем результат забега и пульс нового участника. Вместо каждого из двух значений также может стоять NA.

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

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

Округление не применяется, так как выводятся номера участников.

Ограничения

1 ≤ n ≤ 4000.

Номера участников — различные целые числа от 1 до 999999.

Каждый известный результат забега — целое число от 300 до 10000.

Каждый известный пульс — целое число от 40 до 240.

Строка NA имеет длину 2. Других строковых значений во входе нет.

В строке ЗАПРОС задан хотя бы один известный признак. Хотя бы у одного участника есть общий с ЗАПРОСОМ известный признак.

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

Куда дальше