Powered by:AB_IN 局外人
P1138 第k小整数
求第k小整数。这个是要去重的。
第一种:可以放进set里。
#include <bits/stdc++.h>
using namespace std;
set<int>s;
int main()
{
int n,num,x;
while(cin>>n>>num){
s.clear();
for(int i=1;i<=n;i++){
cin>>x;
s.insert(x);
}
set<int>::iterator it;
int ans=0,cnt=s.size();
for(it=s.begin();it!=s.end();it++){
if(cnt<num)
{cout<<"NO RESULT"<<endl;break;}
ans++;
if(ans==num)
{cout<<*it<<endl;break;}
}
}
return 0;
}
第二种:运用stl函数——unique
,把数组伪去重,重复的数按照升序放在数组后面。
#include<bits/stdc++.h>
typedef long long ll;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
const ll maxn=5e6+10;
char buf[1 << 21], *p1=buf, *p2=buf;
inline ll getc(){
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline ll read() {
ll ret = 0,f = 0;char ch = getc();
while (!isdigit (ch)) {
if (ch == '-') f = 1;
ch = getc();
}
while (isdigit (ch)) {
ret = ret * 10 + ch - 48;
ch = getc();
}
return f ? -ret : ret;
}
ll n,k,a[maxn],ans;
int main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
a[i]=read();
sort(a+1,a+n+1);
ans=unique(a+1,a+n+1)-a;//给数组a去重,并保留ans=去重后非伪的长度
if(k<ans)
printf("%lld",a[k]);
else
printf("NO RESULT");
return 0;
}
完结。