洛谷 P1059【明明的随机数】 题解
事实上,完全可以先将输入进来带有重复的元素们保存进一个数组并对该数组进行排序,再将该数组的各个元素逐个判断是否与前一元素相同(重复与否的判断),将不重复的元素转移至另一个数组,与此同时进行对不重复元素的项数进行计数(懒得打计数器)。
代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //Stand up for the faith! 2 #include<bits/stdc++.h> 3 #define INF 0x3f3f3f3f 4 #define LL long long 5 #define FRO freopen 6 #define FCO fclose 7 #define US unsigned 8 #define CN const 9 #define MAXN 20001 10 11 using namespace std; 12 13 inline LL read() 14 { 15 LL s=0,w=1; 16 char ch=getchar(); 17 while(ch<'0'||ch>'9') 18 { 19 if(ch=='-')w=-1; 20 ch=getchar(); 21 } 22 while(ch>='0'&&ch<='9') 23 { 24 s=s*10+ch-'0'; 25 ch=getchar(); 26 } 27 return s*w; 28 } 29 30 int n,num=1,a[2000],final[2000]; //关于为什么num=1,后面会解释。 31 32 int main(void) 33 { 34 // FRO("****.in","r",stdin); 35 // FRO("****.out","w",stdout); 36 n=read(); 37 for(int i=1;i<=n;i++) 38 { 39 a[i-1]=read(); 40 } 41 sort(a,a+n); //a数组排序。 42 final[0]=a[0]; //i=0时再-1数组会越界,故先处理掉a[0]。 43 for(int i=1;i<n;i++) //判断是否重复(此处因a[0]已处理,直接从a[1]开始)。 44 { 45 if(a[i]==a[i-1]) //如果重复,直接跳过。 46 continue; 47 else //如不重复,将元素转移至final数组 48 { 49 final[num]=a[i]; //此处因为0号元素已经解决,从num=1开始计项数。 50 num++; 51 } 52 } 53 cout<<num<<endl; //输出项数与各个不重复元素。 54 for(int i=0;i<num;i++) //这里不涉及越界,故可以从0开始。 55 { 56 cout<<final[i]<<" "; 57 } 58 return 0; 59 FCO(stdin);FCO(stdout); 60 }