题目描述
现有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
输出样例#1:
3
说明
n≤10000
解析:
1.模拟跑一遍:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[10001],b[30001]; 4 int main() { 5 int n,k,m=0; 6 cin>>n>>k; 7 for(int i=1; i<=n; i++) 8 cin>>a[i]; 9 sort(a+1,a+n+1); 10 for(int i=1; i<=n; i++) 11 b[a[i]]=1; 12 for(int i=1; i<=a[n]; i++) 13 if(b[i]==1) { 14 m++; 15 if(m==k) { 16 cout<<i; 17 return 0; 18 } 19 } 20 cout<<"NO RESULT"; 21 return 0; 22 }
2.桶排序,相同的只记一次:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int main() { 5 int i,j=1,k,h,n,m; 6 cin>>n>>k; 7 int a1[n+1],x[10001],a[n+1]; 8 for(i=1; i<=10000; i++) 9 x[i]=0; 10 for(i=1; i<=n; i++) { 11 cin>>a1[i]; 12 x[a1[i]]++; 13 } 14 for(i=1; i<=10000; i++) { 15 if(x[i]!=0) { 16 a[j]=i; 17 j++; 18 } 19 } 20 sort(a+1,a+j); 21 if(k>j-1) 22 cout<<"NO RESULT"; 23 else 24 cout<<a[k]; 25 return 0; 26 }
3.STL算法大法好:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 5 using namespace std; 6 7 int a[10001]; 8 int main() { 9 int n,k; 10 cin>>n>>k; 11 for(int i=1;i<=n;i++) { 12 scanf("%d",&a[i]); 13 } 14 sort(a+1,a+1+n); 15 unique(a+1,a+1+n); 16 int tot=0; 17 for(int i=1;;i++) { 18 if(a[i]<=a[i-1])break; 19 ++tot; 20 } 21 if(k>tot)printf("NO RESULT"); 22 else printf("%d",a[k]); 23 return 0; 24 }
4.跑的稍微慢点的优先队列:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <queue> 5 #include <vector> 6 using namespace std; 7 priority_queue<int,vector<int>,greater<int> > q; 8 int main() { 9 int n,k,ans,u=-233; 10 scanf("%d%d",&n,&k); 11 for(int i=1;i<=n;i++) { 12 int a; 13 scanf("%d",&a); 14 q.push(a); 15 } 16 while(k) { 17 if(q.empty()) { 18 printf("NO RESULT"); 19 return 0; 20 } 21 ans=q.top(); 22 if(u!=ans) k--; 23 u=ans; 24 q.pop(); 25 } 26 printf("%d",ans); 27 return 0; 28 }