P1059 [NOIP2006 普及组] 明明的随机数
mason9999999 · · 题解
题目传送门
勿喷,无注释代码在后面
分析题目
关于题目描述,只需要读两句话:1.他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N≤100) 2.请你协助明明完成“去重”与“排序”的工作。
本题解提供三种方法
方法一较麻烦
定义变量:n随机数个数,a[100010]随机数, b[10000010]桶排序,c去重后的长度,maxx最大值;
分析一下
剩下的就在代码里分析吧
#include<bits/stdc++.h>
using namespace std;
int n; //随机数个数
int a[100010],b[10000010],c,maxx;//变量
int main(){
cin>>n;//输入个数
for(int i=0;i<n;i++){//循环
cin>>a[i];//输入
b[a[i]]+=1;//标记
if(b[a[i]]==1) c++;//标记长度:如果加完了刚刚=1那么就有这个数
maxx=max(maxx,a[i]);//最大值:因为我们使用桶排序,应遍历到最大值
}
cout<<c<<endl;//输出长度
// =!因为遍历到最大值,平时用int i=0;i<n的注意了!
for(int i=0;i<=maxx;i++){//应遍历到最大值
if(b[i]>0) cout<<i<<' ';//输出数
}
return 0;//返回
}
方法二还是较麻烦
既然我们只看有没有标记过,所以只有两个状态,1标记过2没有标记过,所以b数组可以使用bool类型 剩下的依旧在代码里分析吧
#include<bits/stdc++.h>
using namespace std;
int n; //随机数个数
int a[100010],c,maxx;//变量
bool b[10000010];//桶
int main(){
cin>>n;//输入个数
for(int i=0;i<n;i++){//循环
cin>>a[i];//输入
b[a[i]]=1;//标记
maxx=max(maxx,a[i]);//最大值:因为我们使用桶排序,应遍历到最大值
}
//因为b是bool类型,所以无法用if(b[a[i]]==1) c++;,因为很容易重复
for(int i=0;i<=maxx;i++){//便利
if(b[i]) c++;//计数
}
cout<<c<<endl;//输出长度
// 是=!!!因为遍历到最大值,平时用int i=0;i<n的注意了!
for(int i=0;i<=maxx;i++){//应遍历到最大值
if(b[i]) cout<<i<<' ';//输出数
}
return 0;//返回
}
方法三简单
unique!!!
详细解释在这
在代码里分析吧
#include<bits/stdc++.h>
using namespace std;
int a[100010];//变量
int n;//随机数个数
int main(){
cin>>n;//输入个数
for(int i=0;i<n;i++){//循环
cin>>a[i];//输入随机数
}
sort(a,a+n);//排序
int len=unique(a,a+n)-a;//去重取长度
cout<<len<<endl;//输出长度
for(int i=0;i<len;i++){//便利
cout<<a[i]<<' ';//输出
}
return 0;
}
无注释代码
方法一
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100010],b[10000010],c,maxx;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
b[a[i]]+=1;
if(b[a[i]]==1) c++;
maxx=max(maxx,a[i]);
}
cout<<c<<endl;
for(int i=0;i<=maxx;i++){
if(b[i]>0) cout<<i<<' ';
}
return 0;
}
方法二
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100010],c,maxx;
bool b[10000010];
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
b[a[i]]=1;
maxx=max(maxx,a[i]);
}
for(int i=0;i<=maxx;i++){
if(b[i]) c++;
}
cout<<c<<endl;
for(int i=0;i<=maxx;i++){
if(b[i]) cout<<i<<' ';
}
return 0;
}
方法三
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int len=unique(a,a+n)-a;
cout<<len<<endl;
for(int i=0;i<len;i++){
cout<<a[i]<<' ';
}
return 0;
}
本人第一篇题解,求过