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; }