Редакция для K-й по величине
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. Идея
Нужно найти элемент, который будет стоять на k-м месте после сортировки массива по возрастанию.
Самый прямой способ: считать все n чисел, отсортировать их и вывести элемент с индексом k - 1, потому что в массиве индексация с нуля, а в условии места нумеруются с единицы.
2. Наблюдения
- После сортировки массива по возрастанию:
- на первом месте стоит минимальный элемент;
- на втором — следующий по величине;
- ...
- на
k-м месте стоит элементa[k - 1].
- В задаче не требуется сохранять исходный порядок элементов.
- Ограничение
n <= 2 * 10^5позволяет спокойно отсортировать массив стандартной сортировкой.
3. Алгоритм
- Считать
nиk. - Считать массив из
nчисел. - Отсортировать массив по возрастанию.
- Вывести элемент
a[k - 1].
4. Почему это работает
После сортировки все элементы массива расположены в неубывающем порядке.
Это означает, что:
- перед элементом
a[0]нет ни одного меньшего элемента, значит это 1-е место; - перед элементом
a[1]ровно один элемент, не больший его, значит это 2-е место; - ...
- перед элементом
a[k - 1]находится ровноk - 1элементов, значит он стоит наk-м месте.
Именно это число и нужно вывести по условию задачи.
5. Сложность
- Сортировка массива из
nэлементов занимаетO(n log n). - Дополнительная память:
O(n)на хранение массива.
6. Код на C++17
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
cout << a[k - 1] << '\n';
return 0;
}
7. Код на Python 3
n, k = map(int, input().split())
a = list(map(int, input().split()))
a.sort()
print(a[k - 1])
Комментарии