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; }
相关文章推荐
- [NOIP2007]统计数字
- 【9207&&b701】统计数字(NOIP2007)
- [NOIP2007] 提高组 洛谷P1097 统计数字
- [NOIP 2007]统计数字
- NOIP2007 提高组 复赛 count 统计数字
- noip2007 tg day1t1 统计数字
- NOIP2007 统计数字
- [模拟][NOIP2007] 统计数字
- 洛谷-统计数字-NOIP2007提高组复赛
- 统计数字(NOIP2007)提高组
- NOIP2007 统计数字
- codevs 1164 || NOIP 2007 统计数字 模拟 解题报告
- noip2007 统计数字 (排序)
- noip2010 数字统计 (统计某一数字区间中,2出现的次数)
- luogu1179 数字统计(NOIP2010普及组第1题)
- [Noip2010普及组]数字统计
- NOIP2010普及组--数字统计
- NOIP 2010普及组 数字统计
- 全国信息学奥林匹克联赛(NOIP2010)复赛 1.数字统计 解题报告
- codevs 1126 数字统计 2010年NOIP全国联赛普及组 x