nth_element-第n小数

题目链接:http://acdream.info/problem?pid=1099

使用方法:nth_element(start, start+n, end)

使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。

Problem Description

一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字。”

Input

第1行 两个整数N, K以空格隔开;

第2行 有N个整数(可出现相同数字,均为随机生成),同样以空格隔开。

0 < n ≤ 5*10^6 , 0 < k ≤ n

1 ≤ xi ≤ 10^8

Output

输出第 k 大的数字。

Sample Input

5 2
5 4 1 3 1

Sample Output

4

Hint

如2,2,1中三个数字中第一大数字为2,第二大数字也为2,第三大数字为1 。

 

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int a[5000005];
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k)){
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        //sort(a,a+n);
        nth_element(a,a+n-k,a+n);
        printf("%d\n",a[n-k]);
    }
}

这个函数的平均复杂度为线性的O(n),当然如果数据极端,便可能退化为O(n^2)了,这个题目如果是用sort排序后提交,TLE无疑。。。

你可能感兴趣的:(Algorithm,STL,nth_element)