题目描述 Description

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入描述 Input Description

有2行,第1行为1个正整数,表示所生成的随机数的N个数:

第2行有N个用空格隔开的正整数,为所产生的随机数

输出描述 Output Description

第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小

到大排好序的不相同的随机数。

样例输入 Sample Input

10

20 40 32 67 40 20 89 300 400 15

样例输出 Sample Output

8

15 20 32 40 67 89 300 400

 WIKIOI难度等级:通过初赛

总耗时:439ms  内存占用:0kb  语言:C++  代码:1382B

耗时还算可以吧,比其他AC的同学普遍好一点儿,好像很少有再短点儿的

代码量很可怕,1382B洋洋洒洒91行

有个同样是用C++的同学只用了273B,真好奇他是怎么写出来的:-)

不过对于代码量这种东西完全不想优化啊。。。虽然臃肿但是简单明了……

BTW,还是不习惯用bool来记录状态,所以就没用它……

 
   
  1. #include <iostream> 
  2.   
  3. using namespace std; 
  4.   
  5. //shell排序 
  6. void sort(int after[],int a) 
  7.     int i,j,k,x,temp; 
  8.       
  9.     k=a/2; 
  10.     while(k>=1) 
  11.     { 
  12.         for(i=k;i<a;i++) 
  13.         { 
  14.             x=after[i]; 
  15.             j=i-k; 
  16.             while(j>=0&&x<after[j]) 
  17.             { 
  18.                 after[j+k]=after[j]; 
  19.                 j-=k; 
  20.             } 
  21.             after[j+k]=x; 
  22.         } 
  23.         k/=2; 
  24.     } 
  25.       
  26.     cout<<a<<endl; 
  27.     for(temp=0;temp<a;temp++) 
  28.     { 
  29.         cout<<after[temp]; 
  30.         if(temp!=a-1) 
  31.         { 
  32.             cout<<" "
  33.         } 
  34.     } 
  35.   
  36. void func(int n) 
  37.     //flag数组作为状态标记 
  38.     int array[n],after[n]; 
  39.     char flag[n]; 
  40.     int temp,sign,a=n; 
  41.       
  42.     //初始化标记数组 
  43.     for(temp=0;temp<n;temp++) 
  44.     { 
  45.         flag[temp]='Y'
  46.     } 
  47.       
  48.     //读入数据 
  49.     for(temp=0;temp<n;temp++) 
  50.     { 
  51.         cin>>array[temp]; 
  52.     } 
  53.       
  54.     //遍历找重 
  55.     for(temp=0;temp<n-1;temp++) 
  56.     { 
  57.         for(sign=temp+1;sign<n;sign++) 
  58.         { 
  59.             if(array[temp]==array[sign]&&flag[sign]=='Y'
  60.             { 
  61.                 flag[sign]='N'
  62.                 a--; 
  63.             } 
  64.         } 
  65.     } 
  66.       
  67.     //数组复制去重 
  68.     sign=0; 
  69.     for(temp=0;temp<n;temp++) 
  70.     { 
  71.         if(flag[temp]=='Y'
  72.         { 
  73.             after[sign++]=array[temp]; 
  74.         } 
  75.     } 
  76.       
  77.     sort(after,a); 
  78.   
  79. int main(int argc,char *argv[]) 
  80.     int n; 
  81.       
  82.     cin>>n; 
  83.     func(n); 
  84.       
  85.     return 0;