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

我又来水题解了略略略

因为我太菜了,所以这次写个黄题的题解…

luogu传送门:看我点我QWQ.

下面是题目搬运


题目描述

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

输入格式

输出格式

输入输出样例

输入 #1
5 1
4 3 2 1 5
输出 #1
2

我严重怀疑这是道红题

这不只是排序吗???

先讲一下我一开始的思路:

将输入的数列进行排序,然后输出第 k 小的数不就完了吗?

对呀,的确完了…

然后附上我第一次做时候的代码(60分):

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    printf("%d",a[m]);
    return 0;
}

结果是3AC,2TLE(我当时心态崩了QWQ)

没错,再看一下题目

n(n<5000000且n为奇数)

数组太大了,导致快排也超时。

这个时候需要用到另一个函数:

nth_element(a,a+m,a+n);

这个函数的意思是:

将a数组中的第n项,排到数列第n个位置

这个函数在这个头文件里:

#include<algorithm>//和sort在一个头文件中

然后附上AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    nth_element(a,a+m,a+n);
    printf("%d",a[m]);
    return 0;
}

这就是它黄题的原因吧(~ ̄▽ ̄)~

原文地址:https://www.cnblogs.com/Kyriech-Francis/p/Answer_P1923.html