题目描述
次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5×109)。
已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入格式
输入共n+1行。
第1行是整数n,表示自然数的个数;
第2至n+1每行一个自然数。
输出格式
输出包含 m 行(m 为 n 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。
每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
数据范围
1≤n≤200000
样例
输入样例:
8
2
4
2
4
5
100
2
100
输出样例:
2 3
4 2
5 1
100 2
看到这道题目的时候。
我的第一反应是——桶排!
但是看到15后面那么多0的时候,才发现原来桶排会炸掉,
所以就想到了排序的做法,大家可以具体看代码里面的注释,会好一些。
C++ 代码
#include<bits/stdc++.h>
long long num[200010];
using namespace std;
int main() {
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>num[i];//数据读入
sort(num,num+n);//排序(从小到大)
long long front,ans=1;//front记录当前的数字,ans记录当前数字的个数。ans务必是1;
for(int i=0;i<n;i++){
front=num[i];//记录当前最小的一个数字
if(num[i]==num[i+1])ans++;//当后一个和当前的一个数字是同一个的时候,ans++;
else{
cout<<front<<' '<<ans<<endl;
ans=1;//设置1是为了避免上面的判断语句的错误
}
}
return 0;//完美结束!
}
巧-,-我特意写了个桶发现炸了。还想着哈希啥的-,-看来是我想多了