洛谷-P1923 【深基9.例4】求第 k 小的数

洛谷-P1923 【深基9.例4】求第 k 小的数

原题链接:https://www.luogu.com.cn/problem/P1923


题目描述

输入 \(n\)(\(n<5000000\)\(n\) 为奇数) 个数字 \(a_i(0<a_i<10^9)\) ,输出这些数字的第 \(k\) 小的数。最小的数是第 0 小。

输入格式

输出格式

输入输出样例

输入 #1

5 1
4 3 2 1 5

输出 #1

2

C++代码

#include <cstdio>
using namespace std;

int a[5000000];

int find_kth(int l, int r, int k) {
    int key = a[l];
    int low = l, high = r;
    while (high > low) {
        while (a[high] >= key && high > low)
            --high;
        a[low] = a[high];
        while (a[low] <= key && high > low)
            ++low;
        a[high] = a[low];
    }
    a[low] = key;
    if (k == low)
        return a[low];
    else if (k < low)
        return find_kth(l, low-1, k);
    else
        return find_kth(low+1, r, k);
}

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i=0; i<n; ++i)
        scanf("%d", &a[i]);
    printf("%d\n", find_kth(0, n-1, k));
    return 0;
}
posted @ 2020-08-16 10:18  yuzec  阅读(561)  评论(0编辑  收藏  举报