Редакция для 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.

Автор: montes332

1. Идея

Нужно найти элемент, который будет стоять на k-м месте после сортировки массива по возрастанию.

Самый прямой способ: считать все n чисел, отсортировать их и вывести элемент с индексом k - 1, потому что в массиве индексация с нуля, а в условии места нумеруются с единицы.

2. Наблюдения

  • После сортировки массива по возрастанию:
    • на первом месте стоит минимальный элемент;
    • на втором — следующий по величине;
    • ...
    • на k-м месте стоит элемент a[k - 1].
  • В задаче не требуется сохранять исходный порядок элементов.
  • Ограничение n <= 2 * 10^5 позволяет спокойно отсортировать массив стандартной сортировкой.

3. Алгоритм

  1. Считать n и k.
  2. Считать массив из n чисел.
  3. Отсортировать массив по возрастанию.
  4. Вывести элемент 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])

Комментарии

Еще нет ни одного комментария.