2007 NOIP 统计数字

来源:互联网 发布:cbox网络电视去广告版 编辑:程序博客网 时间:2024/06/08 06:15

1.统计数字

count.pas/c/cpp

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

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

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


【样例】
输入: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;  }