题目描述 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来记录状态,所以就没用它……
- #include <iostream>
- using namespace std;
- //shell排序
- void sort(int after[],int a)
- {
- int i,j,k,x,temp;
- k=a/2;
- while(k>=1)
- {
- for(i=k;i<a;i++)
- {
- x=after[i];
- j=i-k;
- while(j>=0&&x<after[j])
- {
- after[j+k]=after[j];
- j-=k;
- }
- after[j+k]=x;
- }
- k/=2;
- }
- cout<<a<<endl;
- for(temp=0;temp<a;temp++)
- {
- cout<<after[temp];
- if(temp!=a-1)
- {
- cout<<" ";
- }
- }
- }
- void func(int n)
- {
- //flag数组作为状态标记
- int array[n],after[n];
- char flag[n];
- int temp,sign,a=n;
- //初始化标记数组
- for(temp=0;temp<n;temp++)
- {
- flag[temp]='Y';
- }
- //读入数据
- for(temp=0;temp<n;temp++)
- {
- cin>>array[temp];
- }
- //遍历找重
- for(temp=0;temp<n-1;temp++)
- {
- for(sign=temp+1;sign<n;sign++)
- {
- if(array[temp]==array[sign]&&flag[sign]=='Y')
- {
- flag[sign]='N';
- a--;
- }
- }
- }
- //数组复制去重
- sign=0;
- for(temp=0;temp<n;temp++)
- {
- if(flag[temp]=='Y')
- {
- after[sign++]=array[temp];
- }
- }
- sort(after,a);
- }
- int main(int argc,char *argv[])
- {
- int n;
- cin>>n;
- func(n);
- return 0;
- }
转载于:https://blog.51cto.com/wenryxu/1188718