
《从C++小白到算法高手:GESP 1---8级成长全地图》
第一讲:认识GESP------从编程新手到算法探索者
一、课程导入:我们为什么要学习C++?

老师想先问大家几个问题。
问题1:你们觉得计算机聪明吗?
它可以帮我们计算数学题,可以玩游戏,可以识别图片,可以和我们聊天,还可以控制机器人。
但是,你们有没有想过:
计算机为什么能够完成这么多事情?
因为计算机能够按照我们给它的指令,一步一步地执行任务。
问题2:如果我们想让计算机帮我们解决一个复杂问题,应该怎么办?
比如:
怎样让计算机帮我们统计全班同学的成绩?
怎样让计算机在迷宫中找到出口?
怎样让计算机从100万个数字中快速找到我们想要的数字?
怎样让计算机找到两个城市之间最短的路线?
怎样让计算机帮助我们设计一个游戏?
这些问题,靠简单的输入、输出和加减乘除就能全部解决吗?
当然不行!
我们需要学习更多的编程知识,还需要掌握各种算法。
这就是我们学习C++和信息学竞赛的原因。
1. C++不仅仅是一门编程语言
老师希望大家记住一句话:
学习C++,不仅仅是学习怎样写代码,更是在学习怎样思考问题、分析问题和解决问题。
举个例子。
假设老师给大家一个任务:
班级有30名同学,已经知道每个人的成绩,现在要找出最高分。
一个刚接触编程的同学,可能会想:
我一个一个看,谁的分数最高,就把谁记下来。
这就是最初的解决问题思路。
等我们学会数组,就可以把30名同学的成绩统一保存起来。
等我们学会循环,就可以让计算机自动检查每一个成绩。
等我们学会排序,就可以把所有成绩从小到大排列。
等我们学会更复杂的算法,就可以处理更多数据,解决更加复杂的问题。
你会发现:
同一个问题,随着我们掌握的知识越来越多,解决问题的方法也越来越丰富。
这就是编程思维的成长。
2. 什么是GESP?

它是中国计算机学会(CCF)开展的编程能力等级认证。
我们今天重点介绍的是GESP C++方向。
GESP C++设置了一级到八级,一共八个等级。
大家可以把它想象成一场有八个关卡的编程冒险。
每通过一个阶段,我们就会掌握更多的编程知识,能够解决更加复杂的问题。
不过,大家要注意:
GESP不是简单地考查我们记住了多少条C++语法。
它还会考查计算机基础、数学知识、数据结构、算法思想,以及实际编程解决问题的能力。
所以,我们学习GESP的真正目标,不是只为了拿到一张证书,而是借助这套学习体系,一步一步提高自己的编程能力。
二、八个等级:我们的编程成长地图
接下来,我们来看看:
从GESP一级到八级,我们究竟会经历怎样的学习旅程?
我把八个等级设计成八个成长关卡。
八级编程成长之旅
第一级:编程小助手
认识计算机指令
学会变量、输入输出、条件判断和循环,让计算机听懂我们的基本指令。
第二级:逻辑设计师
让程序更加聪明
学会多层条件、循环嵌套、流程图、编码和数学函数。
第三级:数据探险家
开始处理数据
学习进制转换、位运算、数组、字符串、枚举和模拟。
第四级:程序建筑师
学会组织程序
学习函数、指针、结构体、二维数组、递推和排序。
第五级:算法探索者
学会选择算法
学习数论、链表、二分、递归、分治和贪心。
第六级:搜索与策略大师
进入算法世界
学习树、DFS、BFS、一维动态规划、背包、栈和队列。
第七级:综合算法工程师
挑战复杂问题
学习复杂动态规划、图的遍历、泛洪算法和哈希表。
第八级:算法挑战者
综合运用算法
学习组合数学、倍增、最小生成树、最短路径和算法优化。
这八个等级并不是八个互不相关的知识包。
它们之间有着非常紧密的联系。
例如:
没有学会循环,就很难理解数组的遍历。
没有理解数组和函数,就很难组织复杂程序。
没有理解递归,就很难真正掌握DFS。
没有理解递推,就很难进一步学习动态规划。
没有理解图的存储和遍历,就很难学习最短路径。
所以,我们要按照知识之间的关系,一步一步向前走。
三、四次重要的能力跃迁:学习GESP究竟难在哪里?
这是今天最重要的一部分。
我想给各位解释下:为什么有些同学学习一级、二级时感觉很轻松,到了四级、五级以后,突然觉得难了?
原因是:
随着学习深入,我们需要掌握的不只是更多知识,而是更高级的思考方法。
整个GESP学习过程,可以看成四次重要的能力跃迁。
第一次跃迁:从认识代码到独立编程(GESP 1---3级)

这个阶段,学生就像刚刚进入编程世界的小学徒。
计算机不会自动知道我们想做什么,我们必须把任务变成它能够理解的指令。
例如:
老师让计算机计算1到100的和。
就需要思考:
第一步:从哪里开始?
第二步:每次增加多少?
第三步:什么时候停止?
第四步:怎样保存计算结果?
我们可以通过循环解决这个问题。
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
cout << sum;
return 0;
}
这段代码看起来很简单,但是它已经包含了编程的重要思想:
使用变量保存数据;
使用循环重复执行任务;
使用累加不断更新结果;
使用输出展示最终答案。
到了三级,我们还会继续学习数组、字符串、枚举和模拟算法。
这意味着我们不再只会处理一个数字,而是可以处理一组数据,甚至解决一些简单的算法问题。
这一阶段的成长目标:
从看得懂代码,成长为能够独立写出完整程序。
第二次跃迁:从写代码到组织程序(GESP 4级)

到了四级,我们开始进入一个新的世界。
之前,程序可能只有几十行代码。
现在,我们可能要编写一个学生成绩管理程序,需要保存很多学生的信息,还要完成查询、排序和统计。
如果所有代码都写在main函数里面,会发生什么?
程序越来越长,越来越难理解,也越来越难修改。
这时候,我们需要学习:
函数:把大任务拆成小任务。
结构体:把相关的数据组织在一起。
指针:理解数据在内存中的地址。
二维数组:处理表格和矩阵数据。
递推:根据已有结果计算新的结果。
例如,一个学生有姓名、学号和成绩。
我们可以用结构体把这些信息组织起来:
struct Student {
string name;
int id;
int score;
};
这样,一个Student就可以表示一个完整的学生信息。
我们不再需要用很多彼此独立的变量来描述同一个学生。
这就是数据组织思想。
这一阶段的成长目标:
从会写程序,成长为能够合理组织数据、拆分任务和设计程序。
第三次跃迁:从按照步骤做题到主动选择算法(GESP 5---6级)

这是非常重要的一次转变。
前面学习编程时,题目往往会告诉我们要计算什么,我们只需要按照要求编写代码。
但是到了五级、六级,很多问题不再直接告诉我们应该使用什么方法。
我们需要自己判断。
例如:
现在有100万个已经排好序的数字,需要寻找其中一个数字。
我们有两种办法。
办法一:从头到尾一个一个找。
这叫顺序查找。
办法二:每次查看中间位置,排除一半不可能的数字。
这叫二分查找。

两种方法都可能找到答案,但是效率差别很大。
再比如:
给你一张迷宫地图,怎样找到出口?
我们可以使用DFS,沿着一条道路不断探索。
也可以使用BFS,一层一层向外扩展。
如果题目要求最少走多少步,在符合条件的无权图中,BFS就非常有用。
再往后,我们还会学习动态规划。
这时候,我们需要思考:
怎样定义状态?
当前状态和之前的状态有什么关系?
怎样找到状态转移方程?
怎样避免重复计算?
这已经不是简单的语法问题了,而是真正的算法思维。
这一阶段的成长目标:
从知道怎样写程序,成长为能够分析问题、选择算法并解释算法原理。
第四次跃迁:从解决单一问题到综合建模与优化(GESP 7---8级)

到了七级、八级,我们面对的问题会更加复杂。
例如:
有很多城市,城市之间有道路,每条道路都有不同的长度。
现在要求:
找出两个城市之间最短的路线。
用尽可能低的成本连接所有城市。
对大量数据进行高效处理。
这时候,我们需要学习图论。

我们会接触:
图的存储与遍历;
最短路径;
最小生成树;
倍增法;
组合数学;
复杂动态规划;
时间复杂度和空间复杂度分析;
算法优化。
例如,连接所有城市且总道路成本最低,这是最小生成树问题。
寻找两个城市之间最短的路线,这是最短路径问题。
这些问题需要把实际场景转化为数学模型,再选择合适的算法解决。
这一阶段的成长目标:
从能够解决单一算法问题,成长为能够综合运用数学、数据结构和算法解决复杂问题。
四、八个等级之间有什么联系?为什么不能跳着学?
同学们,老师再给大家讲一个很重要的道理:
算法知识不是一个个孤立的工具,而是一棵不断生长的知识树。
我们来看几个例子。
1. 循环 → 数组 → 枚举 → 搜索

学会循环:让计算机重复做事情。
学会数组:让计算机保存一组数据。
学会枚举:让计算机逐一尝试各种可能。
学会搜索:让计算机系统地寻找符合条件的答案。
你会发现,后面的知识都是在前面知识的基础上发展出来的。
2. 函数 → 递归 → DFS → 回溯

函数:把一个任务独立出来。
递归:函数可以调用自己。
DFS:沿着搜索树的一条路径不断深入。
回溯:发现当前选择不合适时,返回上一步尝试其他选择。
所以,学习DFS之前,如果函数和递归没有真正理解,后面就容易遇到困难。
3. 递推 → 一维DP → 二维DP → 复杂DP

递推:根据以前的结果计算现在的结果。
一维DP:设计一个状态,记录已经计算的答案。
二维DP:使用两个维度描述问题状态。
复杂DP:进一步设计状态、优化转移和空间。
这也是为什么我们不能只背动态规划公式。
真正需要掌握的是状态设计和状态之间的关系。
4. 数组 → 树 → 图 → 图论算法

数组:数据按照连续的位置组织。
树:数据具有父子层次关系。
图:数据之间可以存在更加复杂的连接关系。
图论算法:利用这些关系解决路径、连通性和网络优化问题。
这几条知识链,大家在以后的学习中会反复遇到。
老师希望大家明白:学习新知识时,不仅要问它是什么,还要问它从哪里来、以后能用来做什么。
五、GESP考试究竟考什么?只会写代码够不够?
我们再认识一下GESP考试本身。
GESP不是只考编程题,它还包括选择题、判断题和编程题。
按照你们学习的C++方向大纲,考试通常包含三个部分:
| 题型 | 主要考查内容 |
|---|---|
| 单选题 | 概念、语法、数学、算法知识 |
| 判断题 | 对知识点和程序运行结果的理解 |
| 编程题 | 独立分析问题、设计算法、编写程序 |
不同级别的具体考试时间和题型安排,要以对应级别及当次考试通知为准。
为什么有些同学选择题很好,编程题却做不好?
老师举一个例子。
假设题目要求:
输入10个数字,输出其中最大的数字。
有的同学看到题目会说:
这个我会!最大值就是max!
但真正让他写程序时,却可能遇到这些问题:
不知道怎样读取10个数字。
不知道怎样保存数据。
不知道怎样设计循环。
不知道怎样更新最大值。
不知道怎样处理特殊情况。
这说明什么?
说明认识一个知识点,不等于能够使用这个知识点解决问题。
所以,我们学习每一个级别,都应该同时训练三个能力:
知识理解能力
知道知识是什么,理解它的原理。
算法分析能力
知道题目要求什么,能够设计解决步骤。
编程实现能力
能够独立写出代码,调试程序并验证结果。
这三个能力缺一不可。
六、看看你现在处于哪个成长阶段?
接下来,老师给大家准备几个小问题。
大家不需要紧张,也不需要全部答对。主要是看看自己对未来的学习有多少了解。
GESP成长地图小测验
1 . 如果要让计算机重复计算1到100的数字,最基础的知识是什么?
A、结构体
B、循环
C、指针
2 . 如果要保存30名学生的成绩,最适合先学习什么?
A、数组
B、递归
C、最短路径
3 . 如果要把学生的姓名、学号和成绩放在一起,应该学习什么?
A、循环
B、结构体
C、二分查找
4 . 在一个已经排好序的数组中快速寻找数字,可以使用什么算法?
A、二分查找
B、冒泡排序
C、DFS
5 . 如果要在无权迷宫中寻找最少步数,可以优先考虑什么?
A、高精度运算
B、BFS
C、结构体
6 . 如果要找到连接所有城市且总成本最低的道路网络,属于什么问题?
A、最小生成树
B、字符串匹配
C、进制转换
七、给同学们的一份八级成长任务
最后,老师想给大家布置一个小小的课堂任务。
请大家在纸上画出自己的GESP成长路线。
请完成三个问题:
任务一:找到自己的位置。
你现在学习到GESP哪个级别?已经掌握了哪些知识?
任务二:找到下一个目标。
下一个级别需要学习什么?你最期待学习哪个知识?
任务三:找到自己的挑战。
你认为自己目前最需要加强的是哪方面?
C++基础语法;
独立编程能力;
数组和数据处理;
递归与搜索;
动态规划;
图论与综合算法。
写下自己的答案。
这不仅是一份作业,也可以成为以后每个学习阶段的成长记录。
八、总结:从今天开始,认识真正的编程世界
今天我们没有写很多代码,但是我们认识了一件非常重要的事情:
GESP 1---8级,其实就是学习如何一步一步提高自己解决问题的能力。
我们再回顾一下今天的四次能力跃迁:

老师最后送给大家三句话:
不要害怕新知识,每一个复杂算法都是从简单知识发展而来的。
不要只记代码,要理解代码背后的思想。
不要只关注考试成绩,更要关注自己是否越来越能够独立解决问题。
编程学习是一场长期的冒险。今天你可能只会写一个简单的循环,但未来,你可能用自己编写的算法找到迷宫出口、规划城市道路,甚至创造一个属于自己的智能程序。
这就是我们学习C++的乐趣。