您的位置:首页 > 编程语言 > C语言/C++

2007 NOIP 统计数字

2017-08-08 17:33 281 查看

1.统计数字

count.pas/c/cpp

【问题描述】某次科研调查时得到了n个自然数每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

【输入】输入文件count.in包含n+1行,第一行是整数n表示自然数的个数
第2~n+1每行一个自然数。

【输出】输出文件count.out包含m行,m为n个自然数中不相同数的个数,按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

【样例】
输入:8 4 2 4 5 100 2 100
输出 :
2 3
4 2
5 1
100 2



通过数据限制我们可以看出,自然数的大小可能会特别大,所以就不适合使用像桶排这种标记数组的方法;

这题因为N的大小不是特别大,可以采用存储每个读入的数据,再排序,通过比较排序后的结果输出

附上代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[50010],n,s=1;
int main()
{
cin>>n;//输入自然数个数
for(int i=1;i<=n;++i)
cin>>a[i];//输入每个自然数
sort(a+1,a+n+1);//快排
for(int i=1;i<=n;++i)
{
if(a[i]==a[i+1]) ++s;
else
{
cout<<a[i]<<" "<<s<<endl;
s=1;//重置计数器
}
}
return 0;
}


这题还可以用map容器,要注意end()指向的是最后一个元素的下一个元素

#include<map>
#include<cstdio>
#include<iterator>
using namespace std;
typedef map<int,int> M;
int n;
M c;
int main()
{
scanf("%d",&n);
for(int i=n;i>0;--i)
{
int x;
scanf("%d",&x);
++c[x];
}
for(M::iterator i=c.begin();i!=c.end();++i)
printf("%d %d\n",i->first,i->second);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息