#题外话(第12篇博客)(本题为普及-难度)
#先看题目
题目链接https://www.luogu.com.cn/problem/P1138
#思路 (懒得写了,看代码注释吧)
#代码(保证全AC)
#include<bits/stdc++.h>
using namespace std;
int a[10005],b[10005];//输入列表、处理列表
int main()
{
int n,k,p=0,x,minn,index;//定义变量
bool f=0;//用来看这个数是否重复
memset(b,0,sizeof(b));//赋值为0
cin>>n>>k;
for(int i=0;i<n;i++)cin>>a[i];//输入
for(int i=0;i<n;i++){//第一遍过筛,筛除同样的数(题目要求不重复)
x=a[i];f=0;
for(int j=0;j<n;j++){
if(b[j]==x){//如果在b数组中之前的数与本数相同
f=1;//标记为重复数
break;//跳出循环
}
}
if(f==0){b[p]=x;p++;}//如果该数未在b数组中存在过,那么将其加入b数组(p用于分配在b数组中的位置,为以后的循环节省时间)
}
p+=1;//p是索引数,需要加1变成正常次数。
if(p<=k){cout<<"NO RESULT";return 0;}//如果b数组中的数不够找,那么无解。
for(;k>=0;k--){//这个循环用于逐个筛选 第1小的数-第2小的数-第3小的数-……-第k小的数
minn=30000;//最小值,题目说所有数都不超过30000
for(int j=0;j<p;j++){//本循环用于逐个找到当前最小的数
if(minn>b[j]){
index=j;
minn=b[j];
}
}
if(k!=0)b[index]=30000;//如果k还没有=0(该数不是要找的数),那就“封杀”它,以免影响以后的查找遍历
}
cout<<b[index];//index是上一个循环玩剩下的索引,代表了第k小的数的索引。
return 0;
}//第k小的数