Контрольный результат тренера
Условие
В школьной секции по бегу тренер записал времена (в секундах) всех участников на короткой дистанции.
Чтобы поставить «контрольный результат» на следующую тренировку, он хочет выбрать такое время T, что:
- как минимум половина участников бежали не быстрее T (то есть их время ≥ T),
- и как минимум половина участников бежали не медленнее T (то есть их время ≤ T).
Если подходящих значений несколько (это бывает при чётном числе участников), тренер выбирает меньшее из них.
Найдите выбранное время T.
Формат ввода
Первая строка: целое число n — число участников. Вторая строка: n целых чисел a1, a2, ..., an — времена участников.
Формат вывода
Выведите одно целое число — контрольный результат T.
Ограничения
1 ≤ n ≤ 200001 ≤ ai ≤ 1000000
Пример
Ввод:
5
12 7 10 7 9
Вывод:
9Как решать — идея подхода
Приём: Сортировка и нижняя медиана
Ключевое наблюдение: условия про «как минимум половина не быстрее T» (времена ≥ T) и «как минимум половина не медленнее T» (времена ≤ T) ровно описывают медиану набора.
Если n нечётное, медиана единственная. Если n чётное, подходят все значения между двумя центральными элементами включительно, а по правилу «взять меньшее» нужно выбрать левый из двух центральных — это называют *нижняя медиана*.
Почему работает сортировка: после упорядочивания легко посчитать, сколько элементов слева (≤) и справа (≥) от выбранного.
План решения:
- Считай n и массив времен.
- Отсортируй массив по возрастанию.
- Возьми элемент с индексом
k = (n - 1) // 2(нумерация с нуля). - Выведи
a[k].
Мини-сниппет с формулой индекса:
k = (n - 1) // 2
Сложность: сортировка занимает O(n log n) по времени, память O(n).
Частая ошибка: при чётном n брать n//2 (верхнюю медиану). Здесь нужно именно меньшее подходящее, значит индекс (n-1)//2.
Разберись руками
Есть 5 результатов: 12, 7, 10, 7, 9 секунд. Тренер хочет выбрать такое время T, чтобы не меньше половины были с временем ≤ T и не меньше половины — с временем ≥ T. На этом примере ты руками найдёшь, какое T получится.
- Отсортируй времена по возрастанию, но сделай это пошагово: каждый раз находи минимум в «оставшемся хвосте» и ставь его на следующее место. После каждого шага запиши новый порядок чисел.
- Теперь посмотри на отсортированный список 7 7 9 10 12. Какое число стоит ровно посередине (3-е из 5)? Это и будет выбранное T в этом примере.
- Проверка идеи на числах: сколько участников имеют время ≤ 9? (Сколько чисел не больше 9 в исходном списке 12 7 10 7 9.)
Идея: Сначала упорядочь все времена по возрастанию. После этого возьми значение, которое стоит посередине списка; если участников чётное число и «середина» получается из двух соседних значений, выбирай из них меньшее (то, что левее в отсортированном списке).
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки