Редакция для Медиана
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно найти медиану массива нечётной длины.
По определению, медиана — это элемент, который будет стоять ровно посередине после сортировки массива по неубыванию. Значит, достаточно:
- считать все зарплаты;
- отсортировать их;
- вывести элемент с индексом
n / 2.
Так как n нечётно, середина определена однозначно.
2. Наблюдения
- После сортировки массива из
nэлементов индексы идут от0доn - 1. - Если
nнечётно, то серединный элемент имеет индексn / 2при целочисленном делении. - Например:
- при
n = 1медиана имеет индекс0; - при
n = 3медиана имеет индекс1; - при
n = 5медиана имеет индекс2.
- при
Пример:
[5, -2, 5]
После сортировки:
[-2, 5, 5]
Индекс середины: 3 / 2 = 1, значит медиана — 5.
3. Алгоритм
- Считать число
n. - Считать массив
aизnчисел. - Отсортировать массив
a. - Вывести
a[n / 2].
4. Почему это работает
По условию медиана — это число, которое окажется ровно посередине после упорядочивания всех значений.
После сортировки:
- слева от элемента
a[n / 2]находится ровноn / 2элементов; - справа от него тоже находится ровно
n / 2элементов, потому чтоnнечётно.
Значит, элемент a[n / 2] и есть медиана по определению.
5. Сложность
Основное время занимает сортировка.
- Время:
O(n log n) - Память:
O(n)на хранение массива
Это укладывается в ограничения при n <= 2 * 10^5.
6. Код на C++17
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
cout << a[n / 2] << '\n';
return 0;
}
7. Код на Python 3
n = int(input())
a = list(map(int, input().split()))
a.sort()
print(a[n // 2])
Комментарии