2025年3月的GESP C++七级考试刚结束那阵子,群里不少同学就在对答案。七级这张卷子里,选择题和判断题加起来占了40分左右,表面看是理论题,实际上比想象中更能拉开差距。很多同学侧重于刷编程题,忽略了这些基础题,结果估分和实际分数差出一截。这套题并不是简单背概念,而是把数据结构、算法策略、复杂度分析、代码行为判断全揉在一起考。我把这次选择题和判断题按回忆版本逐一做了还原和拆解,结合考点、易错点、答题思路写清楚,给准备后续考级的同学做参考。
1. 考前必须搞懂的出题逻辑
1.1 选择题和判断题到底在考什么
GESP七级的选择题有个很明显的特点:不考死知识。比如它不会直接问你“二叉树的定义是什么”,而是给你一段操作代码,让你判断某个函数执行后的结果;也不会单独考“动态规划的基本思想”,而是给出一个递归改动态规划的片段,让你判断时间复杂度的变化。这说明命题人默认你已经掌握了基本概念,重点考察理解深度和应用能力。
判断题则更像“概念纠错”。它会把一些看起来正确、实际有前提条件的表述拿出来,让你判断对错。比如“只要使用动态规划就能降低时间复杂度”这类话,少了“问题必须满足最优子结构”的前提,明摆着就是挖坑。这类题读题的时候要格外留意绝对化词汇:一定、必然、肯定、所有、任何,出现这些词十有八九是错的。
还有一点值得注意,七级的选择题基本脱离不了几个固定知识模块:树与图、排序与查找、二叉堆与优先队列、动态规划、搜索剪枝、复杂度的精确计算。每种模块的命题方式相对固定,备考时可以有意识地从这几个方向做专项练习。
1.2 分值分布与备考重点
按照近几年七级的出题习惯,选择题一般10道,每题2分;判断题5道,每题2分。对考生来说,这两部分的目标不是说拿个基本分,而是尽量不丢分。因为后续的编程题满分100分里,能完全做对的同学比例不高,前面的基础题反而是确定性最强的得分来源。
从实际考后的反馈来看,大部分同学栽在三个地方:一是二叉树操作的细节模拟不到位,二是对复杂度的推导只停留在背结论,三是对STL容器内部行为的理解停留在“会用”层面。这三点我会在后面的逐题解析里重点展开。
1.3 备考资料怎么选
七级的官方大纲里列出了知识点范围,但备考阶段光看大纲远远不够。我建议找一个知识点覆盖比较好的题集,重点做三种类型的题:根据代码片段判断输出、复杂度的推导题、带有“陷阱条件”的判断题。扩展开说,经典教材里关于二叉树、图论、DP各章节的课后习题、历年竞赛的初赛单选题,都是非常好的训练材料。
2. 选择题逐题解析
下面的题目是根据参加考试的同学回忆整理还原的,和真题在题干描述、考察角度上基本一致,用于解析考点和答题思路。实际考试中部分题目的数值或细节可能有出入,但知识点对应关系可以直接参考。
2.1 二叉搜索树删除操作的细节模拟
题目(回忆版):对一棵二叉搜索树,依次插入关键字序列 8, 3, 10, 1, 6, 14, 4, 7, 13,然后删除根节点 8。如果采用“用左子树中的最大节点替代被删除节点”的策略,删除后根节点的值是()。
A. 7 B. 6 C. 4 D. 13
这道题考察的是二叉搜索树(BST)删除操作的实现策略。先看插入过程,逐步构建这棵BST:
- 8 作为根。
- 3 比8小,成为8的左孩子。
- 10 比8大,成为8的右孩子。
- 1 比3小,成为3的左孩子。
- 6 比3大,成为3的右孩子。
- 14 比10大,成为10的右孩子。
- 4 比6小,成为6的左孩子。
- 7 比6大,成为6的右孩子。
- 13 比14小,成为14的左孩子。
画出这棵树后可以看清,8的左子树里有节点3、1、6、4、7,左子树中的最大值是7;8的右子树里有节点10、14、13。根据“左子树最大节点替代”的删除策略,删除根节点8的时候,要拿左子树中的最大节点来顶替,这个节点是7。
答案选A。这类题在考场里最忌讳凭直觉猜,最好花十几秒在草稿纸上把树形画出来,每一步插入都走一遍比较逻辑。如果题目的删除策略改成“右子树最小节点替代”,答案就完全不同了。顺带提一下,C++ STL里map和set底层用的红黑树,删除操作的替代逻辑还涉及颜色调整,但GESP七级不考到那么深,能把BST的三种删除情况搞清楚就足够了。
2.2 Dijkstra算法不能处理负权边的原因
题目(回忆版):使用堆优化的Dijkstra算法求解单源最短路径,图中有负权边但无负权环。以下说法正确的是()。
A. 算法仍然可以得到正确结果,只是效率降低 B. 算法可能提前确定某个点的最终距离,导致后续更短路径被忽略 C. 算法会进入死循环 D. 只有边的权重均为整数时算法才能保证正确
Dijkstra算法的核心思想是贪心:每次从堆中取出当前距离最小的点,认为它的最短距离已经确定。这个贪心策略成立的前提是,所有边权非负。因为只有边权非负,才能保证通过其他路径绕到当前节点时不可能比当前值更小。
一旦出现了负权边,情况就变了。假设从起点经过负权边能到一个节点,再从那里转回当前节点,距离可能比当前记录值还小。但Dijkstra算法在考虑替换堆顶节点时,可能已经把这个节点的“最终值”确认了,后面即使发现了更短的路径,也不会再更新它。所以正确答案是B。
把这个问题说明白,可以用一个简单例子。起点s到节点a距离5,s到节点b距离3,同时b有一条到a的负权边-4。从s出发时堆顶是b(距离3),算法立即认为b已经确定;然后取出b,把a更新为3+(-4)=-1。此时a距离是-1,会小于b的3,算法又会回头更新。但假如先取出的是a距离5,标记完成,后面发现通过b到a是-1,它已经不会回头更新a的“确定值”了,结果就是错的。实际实现里虽然堆会弹出更小的值,但问题出在已经标记访问过的节点不会再被更新。负权边正是破坏“先弹出的点就是最终最短路”这一贪心不变量的元凶。
这个知识点在选择题里反复出现。学的时候最好把Bellman-Ford算法和Dijkstra算法放在一起对比,前者可以处理负权边,因为它采用松弛策略,进行n-1轮遍历,每轮对所有边尝试更新,正确性依赖的不是贪心,而是“经过不超过k条边的最短路”这一递推关系。理解了两种算法的本质差异,这类概念题就不容易掉坑。
2.3 时间复杂度计算的细致推导
题目(回忆版):某递归函数 f(n) 的执行逻辑为:当 n ≤ 1 时返回,否则分别调用 f(n/2) 两次,每次调用内部会执行一个时间复杂度为 O(n) 的扫描操作。那么 f(n) 的总时间复杂度为()。
A. O(n) B. O(n log n) C. O(n^2) D. O(2^n)
有些同学看到“调用两次”就直接选了O(2^n),这就是没有真正理解递归树。这道题要画出递归调用层次:
- 第1层:1次调用,规模n,扫描O(n)。
- 第2层:2次调用,每次规模n/2,扫描总时间2×O(n/2)=O(n)。
- 第3层:4次调用,每次规模n/4,扫描总时间4×O(n/4)=O(n)。
每一层扫描的总工作量加起来都是O(n)。递归深度是log₂n层,因为每次除以2,直到n≤1。所以总时间复杂度是每一层O(n)乘以深度log₂n,即O(n log₂n)。
答案选B。这里最关键的是区分“递归调用次数”和“每层扫描总量”。很多时间复杂度算错的根源在于只算了递归树节点的数量,忘了关注每层合并或扫描的代价。如果扫描操作不是O(n)而是O(1),那总复杂度才是O(n);如果scanf的复杂度是O(n²),那总复杂度会变成O(n² log n)。以后遇到类似的递归复杂度题目,就画递归树分层求和,小学二年级的数学都能用上,比死记“主定理”的三种情况可靠得多。
2.4 STL容器底层逻辑的使用陷阱
题目(回忆版):关于C++ STL容器,以下说法正确的是()。
A. vector 在头部插入元素的时间复杂度为 O(1) B. list 支持随机访问,可以通过下标直接获取第k个元素 C. deque 支持在头部和尾部进行 O(1) 的插入/删除操作 D. set 和 map 底层是哈希表,因此查找复杂度为 O(1)
这道题就是典型的“看着都会,一做就错”。逐个选项分析:
- A:vector的本质是连续内存的数组,尾部插入是均摊O(1);头部插入需要把已有元素全部后移,是O(n)。除非配合insert用迭代器插入到begin(),但复杂度依然是线性。
- B:list(list或forward_list)是双向/单向链表,不存在“随机访问”的概念。想取第k个元素只能从头部或尾部逐个遍历,时间复杂度O(k)。
- C:deque是双端队列,结构上是分段的连续存储,两端插入删除都能做到常数级复杂度。
- D:set和map底层是红黑树,查找复杂度是O(log n)。想用O(1)查找应该用unordered_set和unordered_map,它们的底层才是哈希表。
答案选C。这道题答错的朋友大多是把unordered系列容器的特性记到set/map头上了。GESP七级对STL的考察基本停留在“增删改查的复杂度级别”和“容器的适用场景”,备考时可以直接做一张对比表,把vector、deque、list、set/map、unordered系列、priority_queue这几种容器的底层结构、查找复杂度、插入删除复杂度列出来,考前过一遍,就能覆盖掉绝大多数选择题的STL考点。
2.5 堆与优先队列的出队顺序
题目(回忆版):有一个小根堆,依次插入 5, 3, 8, 1, 4, 9, 2,然后连续执行两次弹出堆顶操作。第二次弹出的元素值是()。
A. 5 B. 3 C. 4 D. 2
小根堆的特点是堆顶始终是最小值。第一次插入所有元素后,堆中的最小值是1,第一次弹出得到1。弹出后,堆会重新调整,使新的堆顶变成剩余元素中的最小值。剩余元素是5, 3, 8, 4, 9, 2,其中最小值是2。因此第二次弹出的是2。
答案选D。考场里最常见的错误是把第一次弹出的值当作第二次的答案,或者把最小值序列记错。这类题还有一个更快的方法:不管你问第几次弹出,小根堆弹出的顺序一定是从小到大排列的。按插入序列换一种说法,本题直接找倒数第二小的值即可,5,3,8,1,4,9,2排序后是1,2,3,4,5,8,9,第二次弹出就是2。不过这种“偷懒”只适用于小根堆整体弹出的情况,题目如果穿插push和pop混合操作,就必须一步步模拟堆调整过程了。
2.6 二分答案的边界处理
题目(回忆版):在单调递增序列中,用二分查找寻找“第一个大于等于x的位置”。以下写法正确的是()。
A. 当 a[mid] < x 时,l = mid + 1,否则 r = mid B. 当 a[mid] <= x 时,l = mid,否则 r = mid - 1 C. 当 a[mid] < x 时,l = mid,否则 r = mid - 1 D. 当 a[mid] <= x 时,l = mid + 1,否则 r = mid
这道题不是考“会不会写二分”,而是考“边界条件的理解”。目标是找第一个大于等于x的位置,也就是最左侧满足 a[i] >= x 的位置。
逐一看选项:
- A:如果a[mid] < x,说明mid位置太小,答案在右侧,应该l = mid + 1;否则(a[mid] >= x),mid本身可能就是一个可行位置,应该把右边界收缩到mid,而不是mid-1。所以A的写法符合“左侧可行,右侧排除”的标准模板。
- B:当a[mid] <= x时,说明mid位置的值比x小或等于x,它不满足“大于等于x”的严格条件,应该排除mid,l = mid + 1,而不是l = mid。同时当a[mid] > x时,mid可能是答案,r应该取mid而不是mid - 1。B两处收缩都有问题。
- C:和A相反,把“小于”时l设为mid,可能造成死循环。
- D:用的是“左侧排除”逻辑,能找到的是“第一个大于x的位置”,也就是目标位置后移一位,不是本题要的位置。
答案选A。七级常考的二分题型有两种:一种就是上面的边界写法判断,另一种是二分答案后判定可行性。边界写法记忆其实有一套口诀:找左边界时用r = mid收缩,l = mid + 1排除;找右边界时用l = mid收缩,r = mid - 1排除。二十几行代码可以解决的问题,不要靠现场推,提前把两种模板背熟,考场直接套即可。
2.7 并查集路径压缩后的复杂度判断
题目(回忆版):有n个元素的并查集,执行了m次查找或合并操作。代码中使用了路径压缩和按秩合并优化。总时间复杂度可视为()。
A. O(m + n) B. O(m log n) C. O(n²) D. O(m α(n)),其中α(n)是一个增长极慢的函数
并查集最经典的两个优化是路径压缩和按秩合并。路径压缩能够在find操作中把沿途节点直接指向根,按秩合并保证树的高度不会失控。两者结合后,单次操作的均摊复杂度接近常数级别,准确数学表达是反阿克曼函数α(n)级别。对竞赛场景来说,直接理解为“m次操作总复杂度接近O(m)”完全够用。
答案选D。A选项的O(m+n)描述的是“理想均摊”,实际严谨的界应该带α(n),但它在竞赛常见表述里可以看作正确选项的近似;不过从严谨出题角度,D选项才是标准答案。这种题对纠结于“为什么不是O(m+n)”的同学来说可能有点困惑。我建议记住一件事:看到“路径压缩”“按秩合并”这组关键词,选项里带α(n)的优先选它;如果选项没有α(n),选O(m log n)都不对,因为按秩合并单一优化是O(m log n),两个优化叠加才是更低的上界。实际考试命题一般会规避这种二义性,题设里会明确“可以认为近似线性”。
2.8 动态规划的优化思想
题目(回忆版):一个动态规划的状态转移方程为 dp[i] = max(dp[i-1], dp[i-2] + value[i]),其中i从2到n。如果只需求最终结果且不需要还原路径,空间复杂度可以优化为()。
A. O(n) B. O(n²) C. O(1) D. O(log n)
这个转移方程是典型的线性DP,有点类似打家劫舍的模式。当前状态只依赖前两个状态,完全不需要保留整个dp数组。用两个变量滚动记录dp[i-1]和dp[i-2],每次迭代更新即可。
答案选C。这类问题考察的是滚动数组优化。做题时先看状态转移方程依赖哪些历史状态:依赖前一个,就只需要一个变量;依赖前两个,需要两个变量;依赖前k个,就需要k个变量。本质上就是把“整个表”压缩成“滑动窗口”。很多同学背了“滚动数组”这个名词,但不知道使用条件——不是所有DP都能滚动,只有状态转移只依赖紧邻的若干历史状态时才能滚动。如果依赖的是任意前置状态(比如典型的LIS问题),就不能简单用常数个变量替代。
2.9 深度优先搜索的状态标记
题目(回忆版):对一张无向图进行深度优先搜索,为了防止重复访问节点,通常用什么数据结构记录已访问节点?以下说法不正确的是()。
A. 使用bool数组标记节点是否已访问 B. 使用集合(set)也可以达到标记去重的效果 C. 使用栈来记录已访问节点,出栈时必须立即清除标记 D. 使用哈希表(unordered_set)记录已访问节点,查找时间更快
DFS的访问标记在不同场景下策略不同。普通图遍历时,节点一旦被访问就永远标记,之后不再入栈,所以bool数组或者unordered_set都能胜任。A、B、D本质上都是在说“用一个结构判断某节点是否已经进过DFS”。C选项的描述有问题:DFS本身用栈模拟递归,但“出栈后立即清除标记”是回溯算法(比如走迷宫找所有路径)的做法,不是普通DFS防重复遍历的做法。如果出栈就清除标记,那一个节点可能被重复访问多次,会导致死循环或者指数级的时间开销。
答案选C。这道题想提醒的是:DFS和回溯是两种相似但不同的搜索策略。GESP七级里搜索题通常考察“连通块大小”“迷宫最短步数”这类问题。分清什么时候用全局visited数组、什么时候用“进入时标记、退出时撤销”,是拿分的关键。
2.10 拓扑排序的入度表应用
题目(回忆版):对一个有向无环图进行拓扑排序,算法的基本过程是:每次选择一个入度为0的节点输出,然后删除它的所有出边。以下哪个结构最适合用来快速取出入度为0的节点?()
A. 栈 B. 队列 C. 优先队列 D. 以上都可以
拓扑排序的经典实现通常用队列:把所有入度为0的节点入队,每次取出队首,处理其邻接节点的入度减1,如果某个邻接节点入度变为0,再将它入队。但栈、优先队列在原理上也完全可行——它们只影响输出顺序。用栈会得到不同的拓扑序,用优先队列可以按特定规则(比如字典序最小)输出,但它们都能保证“只在入度为0时取点”的核心流程。
答案选D。这题考察的是拓扑排序的核心机制,而不是唯一实现。很多同学一看到拓扑排序就条件反射选队列,忽略了另两个选项在逻辑上同样成立。备考时要注意:DFS也可以生成拓扑序,只需要在递归返回时逆序记录节点。所以“拓扑排序只能用队列”是备考阶段最典型的错误认知,命题老师很清楚这个误区,出题挖坑概率极高。
3. 判断题逐题解析
3.1 动态规划满足的特性描述
题目(回忆版):一个问题能用动态规划求解,必须同时满足“最优子结构”和“无后效性”两个条件。()
这道题是对的。最优子结构是指问题的最优解可以由子问题的最优解构成;无后效性是指某个阶段的状态一旦确定,就不会受后续阶段决策的影响。两者确实都是动态规划能够成立的前提。反例是,不含这两个性质的问题,要么贪心更合适,要么只能暴力搜索。这里不用过度解读,这道题属于概念直接判断题。
判断题遇到表述完整、带“必须”“同时”这类限定词的题时,反而要先想清楚:它有可能是对的,因为它给出了充分必要条件。做题诀窍不是看见“必须”就判错,而是检查条件是否真的完备。
3.2 图遍历的时间复杂度判断
题目(回忆版):用邻接表存储的有向图,从某个顶点出发执行一次深度优先遍历,时间复杂度一定是 O(n²),其中n是顶点数。()
这道题是错的。邻接表存储图时,DFS遍历的时间复杂度是O(n + e),其中n是顶点数,e是边数。如果是遍历所有顶点,每个顶点访问一次,每条边在它的出边列表中被检查一次。只有在邻接矩阵存储时才可能达到O(n²)。题干少了“邻接矩阵”,又把“一定”加重读,明显是个陷阱。
这种题在考场里主要考察存储结构对复杂度的影响。复习时要学会区分:邻接矩阵的遍历复杂度固定O(n²),不管边多边少;邻接表的遍历复杂度是O(n+e)。实际编码中图比较稀疏时优先邻接表,就是这个原因。在判断题里,只要出现“时间复杂度一定是XX”,把存储结构、输入规模这些先决条件在心里过一遍,再落笔。
3.3 快速排序的最坏情况描述
题目(回忆版):快速排序在最坏情况下的时间复杂度是 O(n log n)。()
这道题是错的。快速排序的平均情况是O(n log n),最坏情况(每次选择的基准都是当前区间的最小值或最大值,导致划分极度不平衡)是O(n²)。比如对已经有序的数组做快速排序,每次选取第一个元素作为基准时,就会退化成O(n²)。
七级大纲里排序部分不只要求背复杂度,还要理解为什么快排在不理想基准下会退化,以及三数取中、随机化基准等优化手段如何改善退化问题。判断题里给出一个“快排O(n log n)”的绝对化描述,八成是在考最坏情况。
这里也顺带提一下,记忆排序复杂度时可以用一组系统梳理:稳定排序有冒泡、插入、归并;不稳定排序有选择、快排、堆排。堆排最坏和平均都是O(n log n),归并同样,快速的平均是O(n log n)、最坏O(n²)。这些数据几乎每年都会在选择题或判断题里出现至少一次。
3.4 图遍历与连通性关系
题目(回忆版):从无向图某个顶点出发做一次DFS/BFS,如果所有顶点都被访问到,则该图一定是连通图。()
这道题是对的。无向图中,如果从某个顶点出发能够到达所有其他顶点,说明图中任意两个顶点之间都存在路径,这正是连通图的定义。反过来如果图不连通,从某个顶点出发的遍历必然无法访问到其他连通分量里的节点。
题目里“一定是”这次没有坑,因为无向图和有向图情况不同。有向图中从一点出发访问到所有点,说明该图是“单源可达”,不一定强连通。但本题限定了无向图,所以判断为正确。做题时要注意题目限定的条件,最怕把无向图和有向图的性质混在一起。
3.5 二分查找静态数组要求
题目(回忆版):要在数组中执行二分查找,数组必须已经排序,并且支持随机访问。()
这道题是对的。二分查找每次比较后需要跳到数组的中部位置,要求能够以O(1)时间获取任意下标元素,这正是随机访问的定义。如果容器是链表,想获取中间节点只能从头遍历,二分的优势就没了。
这个判断题的重心其实在“随机访问”四个字。链表虽然有序,也不适合二分查找;而数组即使有序,也要求顺序存储才行。把这一点理解透,同时在写二分代码时注意:mid = (l + r) >> 1,强烈建议写成l + (r - l) / 2,防止l和r都很大时加法溢出。这一点在竞赛场景里真实出现过,值得专门记一下。
4. 考场上容易掉进去的坑
4.1 时间分配与做题顺序
七级考试时间虽然相对充裕,但对部分同学来说编程题消耗巨大,前面的基础题如果反复纠结,后面程序题就容易被压缩。我建议的时间分配是:选择题和判断题控制在20分钟内做完,单选题遵循“一遍过”原则,选完就标记,不回头反复修改;判断题读完一遍,有绝对化词汇的马上警惕,没有绝对化词汇的按定义判断。
选择题里如果遇到两个选项都觉得对的情况,宁可选更接近教材表述的那个,也不要空着。GESP有明确规则,选择题和判断题不选不给分,选错也不扣分,所以每道题都必须作答。
4.2 草稿纸使用的实操技巧
解BST插入、堆调整这类题时,草稿纸的排版直接影响正确率。我习惯把每道需要模拟的题按“初始状态→第一次操作→第二次操作”分块记录,不要东写一笔西写一笔。具体到BST删除题,插入每个节点时可以用箭头连线维护树形图,删除时在原图上用不同颜色的笔画出替代路径,能有效避免在考场紧张状态下忘记前几步的操作结果。堆调整题同理,每一轮上滤/下滤都另起一行画堆,不要把多轮调整挤在同一行。
4.3 检查阶段的针对性方案
做完整张卷子后,如果还剩时间,优先检查两处:一是选择题里那些涉及“最坏情况”和“平均情况”的词有没有看混;二是判断题里有没有忽略“无向图/有向图”“有环/无环”“邻接矩阵/邻接表”这些限定词。这两个丢分点基本能覆盖判断题一半以上的错误。
4.4 判断题中绝对化表述的甄别方法
前面反复提到绝对化词汇,这里展开说说到底怎么甄别。看到“一定”的时候不要直接判错,而是把题干里的主语和限定条件拆开:如果是定理本身的严谨表述,那么“一定”无忧;如果题干自己加上了不成立的前提,那么“一定”就是错的。举个例子,“一定可以用动态规划求解”缺了最优子结构,错;“一定满足无后效性”缺了阶段划分的合理性,错;但“无向图中从一点出发访问全图则该图连通”这种本身就是定义级判断,就不会错。这一套甄别方法,做10道判断题至少能救回3道。
5. 实操层面的备考经验
5.1 建立选择题错题本的正确姿势
备考阶段做选择题,不要满足于选出正确答案。每道做错的题,在错题本上至少写三行:第一行是题干考点,第二行是错误选项的原因分析,第三行是正确选项背后的原理。比如第2.7题如果做错,不能只记“选D”,而是要写“并查集的两种优化分别是路径压缩和按秩合并,两者组合后均摊复杂度近常数,数学表示是反阿克曼函数”。这种把错题转化为知识卡片的方式,比刷十套新题更有效。
5.2 考点优先级排序
距离考试还有一个月以上时,优先清理“理解类”考点:二叉树、图论、DP、搜索;距离考试只剩一周时,转向“记忆类”考点:排序复杂度表、STL容器对比表、二分模板、最短路算法适用条件。编程题部分再著重复习树和图的DFS/BFS模板、动规的两种常见模板,以及二分答案的模板。
5.3 考前一周的模拟策略
考前一周不要拼命刷难题,知识深度已经基本定型,这时候更重要的是保持手感。每天固定时间做一套模拟卷的选择题和判断题,限定时间20分钟,做完立刻对答案,重点分析错在哪里。这个阶段如果还能发现某个下图论概念或者STL容器误区,考场上就是实实在在的2分进账。考试前一天晚上把二分模板、拓扑排序模板、并查集三行核心代码默写一遍,睡觉前不再做新题。
6. 从考试反推出来的长期能力提升方向
七级这张卷子整体给我的感觉是:知识覆盖面广但对深度的要求很克制。它不考手写红黑树,也不要求能徒手证明各种复杂度的上界,但要求学生真正理解常用算法的工作原理。这意味着如果备考阶段只背结论不推过程,到考场上会处处碰壁。反过来说,如果能用“教别人”的方式,把二分的边界、Dijkstra的贪心依据、并查集优化的原理讲给自己听,那这套卷子基本拦不住你。
以我个人参加过多轮等级考试的经验,选择题和判断题从来不是“会就会,不会就蒙”。它们考察的是长期做题过程中积累的直觉和严谨性。尤其是七级这个级别,出题人已经默认你刷过大量代码题,在基础题里埋的陷阱都是“如果你只是机械刷题,那你一定踩坑”的类型。真正区分度不在难度,而在于是否真正理解了底层逻辑。这一点,无论后续继续考八级还是转向信息学竞赛,都是通用的核心能力。
217



被折叠的 条评论
为什么被折叠?



