统计数字题解
来源:互联网 发布:手机淘宝商品的秒杀 编辑:程序博客网 时间:2024/06/05 12:07
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
40%的数据满足:1<=n<=1000;
80%的数据满足:1<=n<=50000;
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)。
解:
由于题目说每个数均不超过1500000000,则数组可只开int整形。由于输入数据并没有必要全部储存下来,因此在循环中全部在变量a中输入,边输入边记录出现次数。为了又能记数字,还能记次数,直接开一个二维数组b,用k来记录下标。每次输入a后,就通过循环找b中是否已经储存数字a,若有,则在相应下标的第二格即次数+1,若没有,则k+1,在b[k][0]中存入a将次数记为1。循环完成后,为了满足题目中按数字大小顺序输出还需将b数组进行排序再输出。
参考代码:
#include<cstdio>#include<cstdlib>#include<cstring>int b[10001][2];void f(int m,int n,int key){if(m<=n){return;}int r=m,l=n,i=b[key][0],j=b[key][1];while(r>l){while(r>l&&b[r][0]>i){r--;}b[l][0]=b[r][0];b[l][1]=b[r][1];while(r>l&&b[l][0]<i){l++;}b[r][0]=b[l][0];b[r][1]=b[l][1];}b[l][0]=i;b[l][1]=j;f(m,l+1,l+1);f(l-1,n,n);}int main(){int n,k=0,flag=0;scanf("%d",&n);int a;for(int i=1;i<=n;i++){scanf("%d",&a);for(int j=1;j<=k;j++){if(a==b[j][0]){flag=1;b[j][1]++;break;}}if(flag==0){k++;b[k][0]=a;b[k][1]=1;}flag=0;}f(k,1,1);for(int i=1;i<=k;i++){printf("%d %d\n",b[i][0],b[i][1]);}}
0 0
- 统计数字题解
- 【map练习】【map+模拟】codevs1164 统计数字题解
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字
- 统计数字问题
- 统计数字问题
- 统计数字问题
- 统计数字问题
- 统计数字问题
- 函数模板
- cocos2d-x基础——cocos安装和使用基础
- Piotr's Ants
- 经典算法学习——直接选择排序
- 常用快捷键及shell基本命令
- 统计数字题解
- 离散化求RECT1
- 编译器的工作过程-节选自阮一峰的博文中并加以整理
- 图片缓存
- 【slighttpd】基于lighttpd架构的Server项目实战(1)—前言及设计思路
- 最小公倍数 LCM 1
- 数据库 表
- UVA679模拟小球降落(大数模拟超时是找规律)
- 网页设计中文本输入框的一些参数说明 【精华】