链接:https://ac.nowcoder.com/acm/contest/3800/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
众所周知,给定一个可重集,求它的第 k 小的数字是一个很难的问题,那么现在就来考考你
输入描述:
第一行两个整数 n,k,表示这个可重集的大小以及询问的 k 第二行一共 n 个非负整数,表示这个可重集中所有的数字
输出描述:
一行一个整数,表示这个可重集的第 k 小的数字是什么
示例1
输入
复制
3 1 3 1 2
输出
复制
1
备注:
数据范围
1到10的5次方,k<=n
这道题题意有点不清楚 当你 6 3
1 1 2 2 3 3的时候 是要输出2的
这道题选择排序肯定TLE,不用说。然后我的想法就是以空间换时间,利用桶排。不过桶排的if条件稍微要思考。这里在代码中体现
代码:
#include<stdio.h>
#include<string.h>
long int a[200000];
int main(void)
{
long int n,k,i,j,t;
long int sum,c;
while(scanf("%ld%ld", &n, &k)!=EOF)
{
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%ld", &t);
a[t]++;
}
sum=0;c=0;
for(j=1;j<=100000;j++)
{
sum+=a[j-1];
if(k<=(sum+a[j])&&k>=sum)
{
printf("%ld\n",j);break;
}
}
}
return 0;
}