题目目录
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 22 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入输出样例
输入 #1复制
10 20 40 32 67 40 20 89 300 400 15
输出 #1复制
8 15 20 32 40 67 89 300 400
说明/提示
NOIP 2006 普及组 第一题
(其实虽然是一个NOIP普及组的题,不过他只是第一题,众所周知,第一题还是很有水分的,最多也才普及-吧,何况2006年的时候,NOIP的题都很水)
知识点:排序
思路:
首先将数组排好序(从小到大),接着开始从a[0]判断,如果a[i]==a[i+1],就将a[i]变成0,表示删除a[i],接着数组长度sum--,最后输出sum,接着从0~n-1判断,如果a[i]!=0,就输出a[i]即可。
而排序我们可以采用多种方法:例如插入排序,快速排序,桶排序等等,而我个人喜欢用sort一些(因为简单),在这里顺便给大家说一下sort的用法:
由于sort()的用法太多,所以这里我只给大家说一下最简单的
sort(a,a+n);
意思是将a数组从a[0]到a[n-1]从小到大排序
至于从小到大嘛……
就需要一个函数来解决了!
bool cmp(int a,int b){
return a>b;//可以理解成:从小到大是<,从大到小是>,默认是<
}
接着:
sort(a,a+n,cmp);
回归正题,以下就是通过刚刚讲的知识所写的代码
代码:
#include<iostream>
#include<cmath>
#include<algorithm>//sort要用的
using namespace std;
int main(){
int a[10001],n,sum=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sum=n;//sum的原长度为n
sort(a,a+n);//排序a数组
a[n]=0;//注意a[n]等于0,不然可能a[n]随机数刚好和a[n-1]一样,影响结果
for(int i=0;i<n;i++){
if(a[i]==a[i+1]){//判断
a[i]=0;//0代表删除
sum--;//数组长度-1
}
}
cout<<sum<<endl;//输出长度
for(int i=0;i<n;i++){
if(a[i]!=0){//若a[i]被删除,则跳过
cout<<a[i]<<' ';
}
}
return 0;
}
做完题后,检查一下数据范围,时间复杂度,以免发生WA声一片,N<=100,我开的10001,完全够用,接着看时间复杂度,sort的时间复杂度是,加上输入和判断,大概是
,N<=100,
绝对不会超时的。
愉快AC! ! !
整体难度较小,但是有一些小细节需要注意,例如11行,需要认真思考
温馨提示:Don't copy the code!