题意就是从一个无序的数组中找出第k大的数,由于数据很多,容易TLE,而且数组中的元素很大,用hash会MLE;
解法一:
/*
利用STL库函数:nth_element(start, start+n, end)(头文件是<algorithm>)
使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。
*/
#include <iostream> #include <cstdio> #include <algorithm> #define LL long long #define N 6000020 using namespace std; int a[N]; int main() { int n,k,i; cin>>n>>k; for(i=0; i<n; i++) scanf("%d",&a[i]); nth_element(a,a+n-k+1,a+n); printf("%d ",a[n-k]); return 0; }
解法二:
/*
解法二:
快排的思想:
加个优化,快排的时候把比枢轴(用来做被比较的标准数)大于等于的放在前面,小的放后面;
***********************优化重点来了**********************
若是比枢轴大的数的个数比k大,那么只需要递归左边的区域,否则递归右边的区域
************************************************************
*/
#include <iostream> #include <queue> #include <cstdio> #include <algorithm> #define LL long long #define N 6000020 using namespace std; int a[N],n,k; int mysort(int left,int right) { int l=left,r=right; if(l<r) { int x=a[l]; while(l<r) { while( l<r && a[r]<x) r--; if(l<r) { a[l]=a[r]; l++; } while( l<r && a[l]>=x) l++; if(l<r) { a[r]=a[l]; r--; } } a[l]=x; if(l==k) return l; if(l>k)/* 此处的优化 */ mysort(left,l-1); else mysort(l+1,right); } } int main() { int i; cin>>n>>k; for(i=1; i<=n; i++) scanf("%d",&a[i]); mysort(1,n); printf("%d ",a[k]); return 0; }