P1138 第 k 小整数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
dalao 勿喷,适合新手
思路就是排序加查重,最后判断第k小数。思路十分简单。
刚开始我一直想二维循环查重
错误代码:
#include<iostream> #include<algorithm> using namespace std; int a[1000005],n,k; int main() { cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; int f=k; sort(a,a+n); /* for(int i=1;i<=n;i++) { cout<<a[i]<<" "; if(i==n){ cout<<endl; } } */ for(int i=1;i<=f;i++){ for(int j=i+1;j<=n;j++){ if(a[i]==a[j]){ f++;//cout<<i<<" "<<j<<" "<<f<<endl; 不进行查重,有重复次数,直接累加循环次数 } else break; } if(i==f){ cout<<a[i]; return 0; } } cout<<"NO RESULT"; return 0; }
也不知道错哪,样例对了,自己造的数也对了,但只得20分。
后来改变了思路,直接用大于号这样就不用查重了
代码如下:
#include<iostream> #include<cstdlib> #include<algorithm> using namespace std; int i,n,k,f; int a[10010]; int main(){ cin>>n>>k; for(i=1;i<=n;i++){ cin>>a[i]; //输入n个数 } sort(a+1,a+n+1); for(i=1;i<=n;i++){ if(a[i]>a[i-1]){ //判断k第几小 k--; f=i; } if(k<=0) break; //条件break } if(k==0) cout<<a[f]<<endl; else cout<<"NO RESULT"<<endl; //判断,如果已经循环完了但是还没有找到第k小的,就输出NO RESULT return 0; }
祝大家RT++;