Time Limit: 10 second
Memory Limit: 2 MB
问题描述
现有n个整数,n≤10000,要求出这n个正整数中的第k个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于30000
Input
第一行为n和k,第二行开始为n个正整数的值,整数间用空格隔开。
Output
第k个最小整数的值;若无解,则输出“NO RESULT”(大写)。
Sample Input
10 3 1 3 3 7 2 5 1 2 4 6
Sample Output
3
【题解】
也是计数排序的应用。定义一个bool数组 1..30000,然后遇到一个数字就bool[number] = true;
最后从小到大,枚举,如果遇到了第k个boo[i] == true 就直接输出i;
【代码】
#include <cstdio>
const int maxnumber = 30000;
bool bo[maxnumber+10];
int n,k;
void input_data()
{
for (int i = 1;i <= maxnumber;i++) //初始化bo数组
bo[i] = false;
scanf("%d %d",&n,&k);
for (int i = 1;i <= n;i++)
{
int t;
scanf("%d",&t);
bo[t] = true; //遇到一个数字则操作这个数字存在
}
}
void output_ans()
{
int t = 0;
for (int i = 1;i <= maxnumber;i ++) //从小到大扫描 遇到一个就递增t
if (bo[i])
{
t++;
if (t == k) //如果找到了第k个数字 就输出
{
printf("%d",i);
break;
}
}
if (t != k) //没有找到第k个数字就输出无解信息。
printf("NO RESULT");
}
int main()
{
//freopen("E:\\rush.txt","r",stdin);
input_data();
output_ans();
return 0;
}