题目描述
现有 n 个正整数,n≤10000,要求出这 n 个正整数中的第 k 个最小整数(相同大小的整数只计算一次),
k≤1000,正整数均小于 30000。
输入描述:
第一行为 n 和 k,第二行开始为 n 个正整数的值,整数间用空格隔开。
输出描述:
第 k 个最小整数的值;若无解,则输出“NO RESULT”。
示例1
输入
10 3 1 3 3 7 2 5 1 2 4 6
输出
3
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a[10001] = { 0 }; //输入的一串数字
int k;
int t;
int b[10001] = { 0 }; //剔除掉相同数字的新的一串数字
scanf("%d", &k);
int j = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &t);
if (a[t] == 0) {
a[t] = t;
b[j] = t; //从输入步骤就开始剔除相同数字,类似于桶排序,b数组的所有
//下表数都是0,当第一次加入新数时,if判真执行,如果再输
// 入一个相同的数字if判假不执行
j++; //我们用j来控制b数组的大小,让b下标严格从0开始依次加加
}
}
int temp = b[0];
for ( int i = 0; i < j - 1; i++)
{
for ( int h = 0; h < j - i - 1; h++)//别忘了让j减去1,否则最后一个数会跟一个地址
//比大小并交换
{
if (b[h + 1] < b[h])
{
temp = b[h]; //冒泡算法排序
b[h] = b[h + 1];
b[h+ 1] = temp;
}
}
}
if (k > j||k==0) //判断一下临界情况就OK了
{
printf("NO RESULT");
}
else {
printf("%d", b[k - 1]); //别忘了数组下标是从0开始的
}
}