先看题目
在一个有n个元素的数组中输出第k小的数(重复的只算一次),如果无解,输出NO RESULT。
数据规模
对于100%的数据 n<=10000,k<=1000,所有正整数均小于30000
解法一:
将数据放入一个容器中,循环遍历这个容器,每次将k-1,当k=0时,就输出当前下标
代码如下
#include<iostream>
using namespace std;
#define maxn 10010
int a[maxn]={0};
int main(){
int n,x,k;
cin >>n>>k;
for(int i = 1; i <= n; i++)
{
//放入容器中
cin >> x;
a[x]++;
}
for(int i = 0;i <= 10000; i++)
{
if(a[i] != 0)
{
//开始计数
k--;
if(k == 0)
{
cout << i;
return 0;
}
}
}
//没有就输出"NO RESULT"
cout << "NO RESULT";
return 0;
}
解法二:
既然说重复的只算一次,那就给他先去重,这里介绍一个STL中的函数unique(),可以给数组伪去重,即将重复的数字放到后面,需原数组已经有序。要导入algorithm库,格式如下
unique(a+first,a+last)//这段代码可以给数组a[first,last)区间内伪去重
unique(a+first,a+last)-a//a数组去重后的长度
那么就是用sort排序,再去重,如果k大于去重后的数组长度,那么就输出“NO RESULT”
代码如下
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 10010
int a[maxn];
int main(){
int n,k;
cin>>n>>k;
for (int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int x=unique(a,a+n)-a;
if (k>x) cout<<"NO RESULT";
else{
cout<<a[k];
}
return 0;
}