题目链接:http://acdream.info/problem?pid=1099
使用方法:nth_element(start, start+n, end)
使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。
一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字。”
第1行 两个整数N, K以空格隔开;
第2行 有N个整数(可出现相同数字,均为随机生成),同样以空格隔开。
0 < n ≤ 5*10^6 , 0 < k ≤ n
1 ≤ xi ≤ 10^8
5 2 5 4 1 3 1
4
#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无疑。。。