第k小数
题意:
给定长度为n的序列,问序列中的第k小数是多少
数据范围:n<=5e6
解法:
std::nth_element(std::begin(numbers), std::begin(numbers) + count, std::end(numbers) , std::greater<>());
第4个参数自定义cmp可缺省,默认为<,
例如a[1]-a[n],需要求第k小
nth_element(a+1,a+k,a+1+n)
为什么第二项不是a+1+k呢
因为它会视a[1]为b[0],视第k项为b[k-1],然而它的b[k-1]才是我们的a[k],用法有点特别
这个函数会将小于第k小的全部放在左边,大于第k小的全部放在右边
我猜测这个函数的具体实现应该是快排的那种分治(所以也可以手写快排线性求第k项的算法)
code:
这题不用快读会TLE
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5;
int a[N];
int read(){
int x=0,f=1;char c=getchar();//
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return f*x;
}
int main(){
int T=read();
while(T--){
int n=read(),k=read();
for(int i=1; i<=n; i++){
a[i]=read();
}
nth_element(a+1,a+k,a+1+n);
printf("%d\n",a[k]);
}
return 0;
}