【题目链接】

ybt 1239:统计数字
ybt 1847:【07NOIP提高组】统计数字
一本通中限制不许使用STL,那么引入头文件不能写<bits/stdc++.h>,只能写<iostream>,否则不允许提交。
OpenJudge NOI 2.4 7909:统计数字
洛谷 P1097 [NOIP2007 提高组] 统计数字

【题目考点】

1. 二分查找

2. 插入排序

【解题思路】

如果数字范围很小,用散列思想,设数组ct,ct[i]表示数字i出现的次数,遍历并计数即可。但该题数字范围很大,达到 1 0 9 10^9 109。
如果设int型数组长度为 1 0 9 10^9 109,那么占用的内存空间为: 1 0 9 B ∗ 4 / 1024 / 1024 ≈ 3814 M B 10^9B*4/1024/1024\approx 3814MB 109B∗4/1024/1024≈3814MB,而题目内存限制 65536 K B = 64 M 65536KB=64M 65536KB=64M,超出了题目给定的内存限制,所以不可行。
该题指明:不相同的数不超过10000个,可以以这一点为突破口。设一个数组a,以升序保存已经出现了的不相同的数字。另设一个数组ct,ct[i]为a[i]出现的个数。(或者设结构体,将数字和出现的个数合在一起处理)
要添加一个新的数字x时,有2种方法:

解法1:查找有序数组a中是否存在x

  • 如果存在x,找到值x的下标i,a[i]的个数增加1.
  • 如果不存在x,做插入排序中的一步,将数字x(以及ct中对应的元素)插入到有序序列中

解法2:查找有序数组a中大于等于x的最小元素的最小下标

假设找到下标i

  • 如果a[i]等于x,那么a[i]的个数增加1
  • 如果a[i]不等于x,那么应该将x插到第i位置。数组a从最末位置到第i位置依次向后移动一个位置,再让a[i] = x

解法3:先排序,后遍历

先用快排对所有数字排序,而后遍历整个数组,统计每种数字出现的个数并输出。

【题解代码】

解法1:查找有序数组a中是否存在x

#include <iostream>//ybt该题不能引入<bits/stdc++.h>
using namespace std;
#define N 10005
struct Num
{int n, c;//n:数字 c:个数
};
Num a[N];
int n, x, ai;//ai:a中元素的个数
int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", &x);int l = 1, r = ai, m = 0;while(l <= r){m = (l + r) / 2;if(x < a[m].n)r = m - 1;else if(x > a[m].n)l = m + 1;elsebreak;}if(m != 0 && a[m].n == x)a[m].c++;else{//把x插入aa[++ai].n = x;a[ai].c = 1;for(int j = ai; j > 1; --j){if(a[j].n < a[j-1].n)swap(a[j], a[j-1]);elsebreak;}}}for(int i = 1; i <= ai; ++i)printf("%d %d\n", a[i].n, a[i].c);return 0;
}

解法2:查找有序数组a中大于等于x的最小元素的最小下标

#include <iostream>//ybt该题不能引入<bits/stdc++.h>
using namespace std;
#define N 10005
struct Num
{int n, c;//n:数字 c:个数
};
Num a[N];
int n, x, ai;//ai:a中元素的个数
int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", &x);int l = 1, r = ai, m = 0;while(l < r){m = (l + r) / 2;if(a[m].n >= x)r = m;elsel = m + 1;}if(a[l].n < x)//如果序列中没有大于等于x的最小值,就把x放在末尾 {a[++ai].n = x;a[ai].c = 1;}else if(a[l].n == x)a[l].c++;else{//把x插入a[l]for(int j = ai; j >= l; --j)a[j+1] = a[j];a[l].n = x;a[l].c = 1;++ai;} }for(int i = 1; i <= ai; ++i)printf("%d %d\n", a[i].n, a[i].c);return 0;
}

解法3:先排序,后遍历

#include<bits/stdc++.h>
using namespace std;
#define N 200005
int main()
{int n, a[N], ct = 0, num;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];sort(a+1, a+1+n);num = a[1];for(int i = 1; i <= n; ++i){if(a[i] == num)ct++;else{cout << num << ' ' << ct << endl;ct = 1;num = a[i];}} cout << num  << ' ' << ct << endl;return 0;
}

信息学奥赛一本通 1239:统计数字 | 1847:【07NOIP提高组】统计数字 | OpenJudge NOI 2.4 7909 | 洛谷 P1097 [NOIP2007 提高组] 统计数字相关推荐

  1. 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金

    [题目链接] ybt 1179:奖学金 ybt 1938:[07NOIP普及组]奖学金 OpenJudge NOI 1.10 04:奖学金 洛谷 P1093 [NOIP2007 普及组] 奖学金 [题 ...

  2. 信息学奥赛一本通 1958:【12NOIP普及组】寻宝 | OpenJudge NOI 1.12 06 | 洛谷 P1076 [NOIP2012 普及组] 寻宝

    [题目链接] ybt 1958:[12NOIP普及组]寻宝 洛谷 P1076 [NOIP2012 普及组] 寻宝 OpenJudge NOI 1.12 06:寻宝 [题目考点] 1. 模拟 2. 循环 ...

  3. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币

    [题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...

  4. 信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转

    [题目链接] ybt 1089:数字反转 ybt 1953:[11NOIP普及组]数字反转 OpenJudge NOI 1.5 29:数字反转 洛谷 P1307 [NOIP2011 普及组] 数字反转 ...

  5. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

  6. 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和

    [题目链接] ybt 1173:阶乘和 注:一本通上这题,应该把n≤50n\le50n≤50当做n≤100n\le100n≤100来看 OpenJudge NOI 1.6 15:阶乘和 洛谷 P100 ...

  7. 信息学奥赛一本通 1180 | 1946:【09NOIP普及组】分数线划定 | OpenJudge NOI 1.10 05 | 洛谷 P1068 [NOIP2009 普及组] 分数线划定

    [题目链接] ybt 1180:分数线划定 ybt 1946:[09NOIP普及组]分数线划定 OpenJudge NOI 1.10 05:分数线划定 洛谷 P1068 [NOIP2009 普及组] ...

  8. 信息学奥赛一本通 1184 | 1934:【06NOIP普及组】明明的随机数 | OpenJudge NOI 1.10 09 | 洛谷 P1059 [NOIP2006 普及组] 明明的随机数

    [题目链接] ybt 1184:明明的随机数 ybt 1934:[06NOIP普及组]明明的随机数 OpenJudge NOI 1.10 09:明明的随机数 洛谷 P1059 [NOIP2006 普及 ...

  9. 信息学奥赛一本通 1107:校门外的树 | 1931:【05NOIP普及组】校门外的树 | OpenJudge NOI 1.6 06 | 洛谷 P1047 [NOIP2005 普及组] 校门外的树

    [题目链接] ybt 1107:校门外的树 ybt 1931:[05NOIP普及组]校门外的树 OpenJudge NOI 1.6 06:校门外的树 洛谷 P1047 [NOIP2005 普及组] 校 ...

最新文章

  1. php如何给进入网页加入密码,怎么给一个PHP密码访问页面加超链接
  2. Oracle 用shutdown+immediate关机后启动方法
  3. 吐血整理 | 肝翻 Linux 进程调度所有知识点|中奖揭晓
  4. 2.3 KNN-采用机器学习库来预测鸢尾花的分类
  5. 增加 jQueryValidate的手机号验证功能
  6. Linux:chmod命令-修改文件或目录的权限
  7. 什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性
  8. RabbitMQ延迟消息的极限是多少?
  9. Xshell连接Ubuntu时提示SSH服务器拒绝了密码
  10. JavaScript 用typeof来判断是否是对象的弊端
  11. python 闭包和装饰器详解_实力讲解,一文读懂Python闭包与装饰器!
  12. 《java程序设计基础》使用Reader和Writer流类
  13. Latex在线简历制作
  14. 华为matepad 鸿蒙,鸿蒙阵营再添一员猛将!华为全新平板曝光
  15. mac下安装node.js6 ,【并使用zsh】
  16. 并购当当是海航自编自导的一场大戏
  17. Python计算机视觉(五)——基于BOW的图像检索
  18. css界面内容可滚动_带有CSS滚动捕捉点的直观滚动界面
  19. 反射内存卡VMIPCI-5565 PMC5565
  20. 有趣的代码:一行Python代码能干嘛?

热门文章

  1. 高考志愿填报,选专业应该考虑哪些因素?
  2. 2021年高考志愿计算机类各大专业分析
  3. 虚拟机也能做服务器吗,虚拟机可以做服务器吗
  4. iOS 组件化的创建 -创建 cocoapods 库
  5. MapStruct进阶使用<二>
  6. [数据结构]题海啊,全是水(三)链表中倒数第k个节点、链表的回文结构、链表分割
  7. python requests 设置cookies
  8. Python安装路径更改到其他盘
  9. 【SolidWorks】给表面粗糙度绘制多条引线
  10. 2023年全国最新二级建造师精选真题及答案9