第k小数
题目描述
给你一个长度为n的序列,求序列中第k小数的多少。
输入描述:
多组输入,第一行读入一个整数T表示有T组数据。
每组数据占两行,第一行为两个整数n,k,表示数列长度和k。
第二行为n个用空格隔开的整数。
输出描述:
对于每组数据,输出它的第k小数是多少。
每组数据之间用空格隔开
输入:
2
5 2
1 4 2 3 4
3 3
3 2 1
输出:
2
3
链接:https://ac.nowcoder.com/acm/contest/5773/A
来源:牛客网
备注:
t≤10,1≤n≤5×106,k≤n,数列里每个数都在int范围内t \leq10 , 1\leq n\leq5\times 10^6,k\leq n,数列里每个数都在int范围内t≤10,1≤n≤5×106,k≤n,数列里每个数都在int范围内
由于输入比较多,请使用快读读取。
例如:
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const double eps = 1e-10;
const int maxn = 5e6 + 10;
int a[maxn];
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
int qsort(int l,int r) //a[]代表无序数组,l代表左边界,r代表右边界
{
int x = a[l],i = l,j = r; //i,j一开始分别指向左右边界,并将做边界的数值记录下
while(i < j)
{
while(i < j && a[j] >= x)
j--; //从右边界开始判断,如果大于x值,j往左移,如果遇见小于的话,跳出循环
a[i] = a[j]; //跳出循环后,将后面小于x的值,移动到前面去
while(i < j && a[i] <= x)
i++;
a[j] = a[i];
}
a[i] = x; //当i=j时,将x的值赋值到a[i]上去,这时比x小的都在左边,比x大的都在右边
return i;
}
void find(int l,int r,int k)
{
int t=qsort(l,r);
if(k==t)
{
cout<<a[k]<<endl;
return;
}
else if(k-1<t)
{
find(l,t-1,k);
}
else
find(t+1,r,k);
}
int main()
{
int T;
T=read();
int n,k;
while(T--)
{
n=read();
k=read();
for(int i=1; i<=n; i++)
{
a[i]=read();
}
find(1,n,k);
}
return 0;
}
浙公网安备 33010602011771号