题目描述
现有n个正整数,n≤10000,要求出这n个正整数中的第k个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于30000。
输入格式
第一行为n和k; 第二行开始为n个正整数的值,整数间用空格隔开。
输出格式
第k个最小整数的值;若无解,则输出“NO RESULT”。
看完题目,我以为又要水一篇文章了,噼里啪啦就打完了:
解题思路:
输入数组,使用快排排序,前面基本一样,
但在去重方面我独树一帜,想到一个简洁的办法:
每进行计数便判断一下,是否和前一个数相同,如果不相同,计数+1;
代码如下:
1. 定义输入
int n,k;//n个数,取第k小的数
int a[10001];//存放数
int count=0;//计数
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
2.快速排序
sort(a,a+n);//排序
3.判断去重
//-----判断能不能找到这个数-----
if(k>n)
{
cout<<"NO RESULT";
return 0;
}
//-----手动去重-----
for(int i=0;i<n;i++)
{
if(a[i]!=a[i-1])
{
count++;
if(count==k)
{
cout<<a[i];
}
}
}
总的代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;//n个数,取第k小的数
int a[10001];//存放数
int count=0;//计数
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);//排序
//-----判断能不能找到这个数-----
if(k>n)
{
cout<<"NO RESULT";
return 0;
}
//-----手动去重-----
for(int i=0;i<n;i++)
{
if(a[i]!=a[i-1])
{
count++;
if(count==k)
{
cout<<a[i];
}
}
}
return 0;
}
回洛谷测了一下:
咋又有三个点没过呢。
又重新理解了一下题目:发现无解还包括计数<k,重新添加了一段代码
//-----判断count是否>k-----
if(count<k)
{
cout<<"NO RESULT";
}
正解如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;//n个数,取第k小的数
int a[10001];//存放数
int count=0;//计数
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);//排序
//-----判断能不能找到这个数-----
if(k>n)
{
cout<<"NO RESULT";
return 0;
}
//-----手动去重-----
for(int i=0;i<n;i++)
{
if(a[i]!=a[i-1])
{
count++;
if(count==k)
{
cout<<a[i];
}
}
}
//-----判断count是否>k-----
if(count<k)
{
cout<<"NO RESULT";
}
return 0;
}
成功AC,