本书是专门为中小学生编写的一套信息学竞赛教材。作者根据中国计算机学会发布的《全国青少年信息学奥林匹克系列竞赛大纲》,把涉及的知识点按难度等级分成了初级篇、中级篇、高级篇三篇,对应三本教材,每本教材包含40章。本书是初级篇,包括基础算法专题、进制转换、位运算、编码问题、数列问题、高精度、字符串处理、时间和日期处理、数据结构专题、排序专题、搜索专题、动态规划专题、数论专题、组合数学专题、图论专题等内容。每章都是先介绍算法思想或基础知识,再结合经典的竞赛题目来讲解算法的实现。本书配备了完善的题库、课件、教学视频等资源,可以作为中小学信息学竞赛集训队的训练教材,也可以作为少儿编程培训机构的培训教材,还可以作为少儿编程等级考试和编程竞赛的辅导教材。
王桂平
计算机科学与技术专业博士、副教授、硕士研究生导师。自2003年起从事大学生程序设计竞赛指导工作,带队参加过浙江省、重庆市、四川省、广东省大学生程序设计大赛、中国大学生程序设计大赛、国际大学生程序设计大赛、团体程序设计天梯赛、蓝桥杯全国软件和信息技术专业人才大赛等赛事,指导学生累计获得奖项100余项,省级奖项1000余项。
出版了《C++趣味编程及算法入门》《C+编程与信息学竞赛数学基础》《GESP编程能力等级认证一本通(C++一级)》《图论算法理论、实现及应用》等多部著作;主持省部级教学研究项目5项,建设重庆市一流课程一门,以第一作者发表教学研究论文近20篇、科学研究论文30余篇(含SCI论文9篇、EI论文10篇),主持省部级科研项目3项,参与科研项目3项。兼任多所中小学信息学奥林匹克竞赛特聘教练。
周祖松
中学信息技术高级教师,全国信息学竞赛金牌指导教师,重庆市育才中学信息学竞赛总教练。
重庆市基础教育教研项目评审专家库成员,重庆市九龙坡区九龙名师、九龙坡区中小学信息技术名师工作室主持人。中国计算机学会中小学计算机教育研讨会副主席。
担任全国信息学竞赛指导教师培训讲师和冬令营授课讲师。
指导学生参加全国信息学决赛(NOI)有8人获金牌,7人进入国家集训队,2人获国际初中生信息学竞赛金牌。100多人获全国青少年信息学奥林匹克联赛(NOIP)一等奖。
万毅
中学一级教师,重庆第一中学校信息科技教师及信息学竞赛教练,重庆市沙坪坝区新秀骨干教师,全国青少年信息学奥林匹克竞赛指导教师,国培计划(2023)中西部骨干教师项目优秀学员。
陈胤戬
重庆市育才中学信息学竞赛教练,曾获得NOI2020金牌,多次参加ICPC和CCPC区域赛并全部获得金牌,2023年参加GPLT团体程序设计天梯赛并荣获个人登顶先锋。
目 录
第1章 基础算法1:枚举算法
1.1 枚举算法的思想及实现要点
1.2 案例1:积木
1.3 案例2:自我数
1.4 案例3:龙虎斗
第2章 基础算法2:模拟算法
2.1 模拟算法的思想及实现要点
2.2 笛卡儿坐标系和网格中的坐标系
2.3 案例1:醉酒的狱卒
2.4 案例2:扫雷游戏
2.5 案例3:螺旋矩阵
第3章 基础算法3:递推和递归
3.1 递推和递归
3.2 案例1:数的计算
3.3 案例2:整数划分问题
3.4 案例3:三角形的个数
3.5 函数及递归函数设计
第4章 基础算法4:贪心算法
4.1 贪心算法的思想
4.2 案例1:活动安排问题
4.3 贪心算法的基本要素
4.4 0-1背包问题和部分背包问题
4.5 案例2:公路
4.6 案例3:纪念品分组
第5章 基础算法5:分治法
5.1 分治法的思想
5.2 案例1:棋盘覆盖问题
5.3 案例2:幂次方
5.4 案例3:分形
第6章 基础算法6:二分法及应用
6.1 二分法
6.2 二分查找
6.3 二分答案
6.4 C++中的二分查找函数
6.5 案例1:复合单词
6.6 案例2:垦田计划
6.7 案例3:跳石头
第7章 进制的思想及进制转换
7.1 数位和计数单位
7.2 进制及进制转换
7.3 实现进制转换的库函数
7.4 标准模板库中的位组(bitset)
7.5 案例1:统计好数
7.6 案例2:优秀的拆分
7.7 案例3:回文数
第8章 位运算及应用
8.1 位运算
8.2 位运算的应用
8.3 案例1:关灯游戏
8.4 案例2:格雷码
8.5 案例3:动物园
第9章 编码问题及处理
9.1 从ASCII编码说起
9.2 字符编码问题
9.3 案例1:圆括号编码
9.4 案例2:莫尔斯电码
9.5 案例3:Vigenère密码
第10章 数列问题及处理
10.1 数列及相关问题
10.2 等差数列和等比数列
10.3 案例1:数列1, 1, 2, 1, 2, 3
10.4 案例2:中位数数列
10.5 案例3:数列
第11章 高精度1:高精度计算的基本原理
11.1 高精度数
11.2 用字符型数组或整型数组实现算术运算
11.3 高精度计算原理
11.4 高精度计算要点
11.5 案例1:统计加法运算的进位次数
11.6 案例2:skew二进制
11.7 案例3:双塔问题
第12章 高精度2:高精度数加减法和乘法
12.1 高精度数的加减法和乘法
12.2 高精度运算的压位处理
12.3 案例1:高精度数的加法
12.4 案例2:高精度数的乘法
12.5 案例3:麦森数
第13章 字符及字符串处理(1)
13.1 字符串处理函数
13.2 字符串类string
13.3 字符转换
13.4 案例1:ISBN
13.5 案例2:解密
13.6 案例3:打字纠错
第14章 字符及字符串处理(2)
14.1 回文字符串
14.2 案例1:构造回文
14.3 案例2:镜像回文
14.4 案例3:回文日期
第15章 字符及字符串处理(3)
15.1 子串与子序列的处理
15.2 案例1:字符串包含问题
15.3 案例2:字符串的幂
15.4 案例3:统计单词数
第16章 时间和日期的处理
16.1 时间和日期处理的相关问题
16.2 案例1:相隔天数
16.3 案例2:黑色星期五
16.4 案例3:儒略日
第17章 数据结构1:数组和向量
17.1 数据结构基本概念
17.2 标准模板库
17.3 向量
17.4 案例1:明明的随机数
17.5 案例2:中位数
17.6 案例3:公交换乘
第18章 数据结构2:栈
18.1 栈
18.2 n个元素有多少种出栈顺序
18.3 案例1:括号串匹配
18.4 案例2:奇特的火车站
18.5 案例3:表达式求值
第19章 数据结构3:队列
19.1 队列
19.2 案例1:约瑟夫环问题
19.3 案例2:海港
19.4 案例3:等待时间
第20章 数据结构4:集合
20.1 数学上的集合
20.2 STL中的集合
20.3 案例1:第N个回文数
20.4 案例2:集合的递归定义
20.5 案例3:考勤刷卡
第21章 数据结构5:用数组模拟链表
21.1 数据结构的物理顺序和逻辑顺序
21.2 线性数据结构和非线性数据结构
21.3 顺序结构和链式结构
21.4 线性表:顺序表和链表
21.5 案例1:链表结点的物理/逻辑顺序
21.6 用数组模拟链表
21.7 案例2:好友关系
21.8 案例3:队列安排
第22章 数据结构6:树的概念及存储
22.1 非线性数据结构——树
22.2 图结构和树结构
22.3 二叉树
22.4 树和二叉树的存储
22.5 二叉树的遍历
22.6 案例1:二叉树深度
22.7 案例2:新二叉树
22.8 案例3:FBI树
第23章 排序及排序函数的使用
23.1 排序及排序算法
23.2 排序的应用
23.3 排序函数sort的用法
23.4 案例1:快乐的蠕虫
23.5 案例2:英文姓名排序
23.6 案例3:图书馆管理员
第24章 排序算法原理及应用
24.1 归并排序算法
24.2 快速排序算法
24.3 案例1:求逆序对问题
24.4 案例2:Freda的越野跑
24.5 案例3:求第k小的数
第25章 搜索1:深度优先搜索
25.1 深度优先搜索的思想
25.2 案例1:油田
25.3 案例2:最大的泡泡串
25.4 案例3:选数
25.5 深度优先搜索技巧
第26章 搜索2:广度优先搜索
26.1 广度优先搜索的思想
26.2 案例1:马走日
26.3 案例2:电影系列之《预见未来》
26.4 案例3:回家
第27章 搜索3:搜索的剪枝优化
27.1 搜索的剪枝优化
27.2 案例1:骨头的诱惑
27.3 案例2:小木棍
27.4 案例3:棋盘
第28章 DP1:动态规划的基本思路
28.1 动态规划算法的引入——从数字网格说起
28.2 动态规划算法的思想
28.3 动态规划算法的4个要素
28.4 案例1:数字网格
28.5 动态规划算法的变形——备忘录方法
28.6 案例2:单调回文分解
28.7 案例3:最大子段和
第29章 DP2:一维和二维动态规划
29.1 一维和二维动态规划
29.2 案例1:积木画
29.3 案例2:最大的子矩阵和
29.4 案例3:最大正方形的边长
第30章 DP3:背包类型动态规划
30.1 背包问题及求解算法
30.2 案例1:0-1背包问题
30.3 案例2:比谁猜得准
30.4 案例3:砝码称重
第31章 数论1:整除理论及应用
31.1 自然数与整数
31.2 整除
31.3 筛选法求质数
31.4 哥德巴赫猜想
31.5 案例1:半质数
31.6 案例2:筛选法求质数
31.7 案例3:哥德巴赫猜想
第32章 数论2:最大公约数理论及应用
32.1 最大公约数、互质、最小公倍数
32.2 带余数除法与辗转相除法
32.3 最大公约数理论
32.4 案例1:等差数列
32.5 案例2:最大公约数和最小公倍数
32.6 格点问题
32.7 案例3:兔八哥与猎人
第33章 数论3:唯一分解定理及应用
33.1 唯一分解定理
33.2 符号[x],n!的分解式
33.3 案例1:求标准质因数分解式
33.4 案例2:正除数个数和正除数的和
33.5 案例3:n!的标准质因数分解式
第34章 数论4:同余理论及应用
34.1 同余
34.2 a对模m的逆
34.3 同余类(剩余类)
34.4 同余方程
34.5 中国剩余定理
34.6 案例1:各位数字全为1的数
34.7 案例2:Niven数
34.8 案例3:韩信点兵
第35章 组合数学1:加法原理和乘法原理
35.1 加法原理和乘法原理
35.2 排列和组合公式
35.3 全排列及排列的字典序
35.4 生成序列全排列的函数
35.5 案例1:网格路径
35.6 案例2:产生数
35.7 案例3:过河卒
第36章 组合数学2:用DFS求解排列组合问题
36.1 用DFS求解排列组合问题
36.2 案例1:质数环问题
36.3 案例2:方形硬币
36.4 案例3:正方形
第37章 图论1:图的基本概念和图的存储
37.1 哥尼斯堡七桥问题
37.2 小世界理论
37.3 图的基本概念
37.4 图的存储表示
37.5 案例1:求顶点度数
37.6 编程解题时灵活地存储图
37.7 用向量数组实现邻接表并求顶点度数
37.8 案例2:道路网络
37.9 案例3:共同好友数
第38章 图论2:图的深度优先搜索
38.1 图的深度优先搜索
38.2 图的深度优先搜索的实现
38.3 案例1:红与黑
38.4 案例2:七段码数码管
38.5 用向量数组实现加权图的邻接表
38.6 案例3:道路修建
第39章 图论3:图的广度优先搜索
39.1 图的广度优先搜索
39.2 图的广度优先搜索的实现
39.3 案例1:奇怪的电梯
39.4 案例2:迷宫
39.5 案例3:医院选址问题
第40章 图论4:DAG和拓扑排序
40.1 AOV网络和拓扑排序
40.2 拓扑排序算法
40.3 案例1:拓扑排序实现
40.4 关于拓扑排序的进一步说明
40.5 案例2:将所有元素排序
40.6 案例3:最大食物链计数
附录A 标识符命名规范与代码规范
附录B 课程资源使用说明
参考文献