
一到GESP考季后台私信最多的就是六个字选择题怎么练。尤其备考六级的学生编程题磕磕碰碰能写个大概一碰选择判断题就原形毕露十个题错七个是常态。这题真没你想的那么难但你得先知道它考什么、怎么挖坑、怎么高效拿分。这篇东西我就把GESP六级选择判断题的考点、套路、真题风格和考场策略一次聊透刷完照着练客观题保底拿个不错的分数不是问题。先给不熟悉的读者交代下背景。GESP全称是青少年编程能力等级认证一共八级一年四次考试C和Python两个方向分开考。六级在整套体系里是个明显的分水岭一级二级考基础语法三四级考数组、函数、结构体从五级开始真正进入算法与数据结构到六级就是二叉树、图论、贪心、动态规划这些硬货。很多学校的信息学老师会建议学生把六级作为考CSP-J/S之前的练兵场原因很简单——六级客观题里反复出现的复杂度分析、存储结构判断、动态规划模型恰恰是后续比赛里最容易丢分的地方。1. 六级选择判断题是什么水平值得花时间吗1.1 六级在GESP体系里的位置如果你想感受六级的真实难度别去看大纲里那些抽象描述直接翻近两年真题更直观。五级之前的选择题基本是“这个代码输出什么”的水平看到循环和数组基本能推出来六级的选择题开始反过来考你——给你一个算法描述问你它的时间复杂度是多少或者给你一个数据结构的性质问你哪句话描述错了。这两种问法对底层理解的要求完全不一样。按我印象里的试卷结构六级通常是15道单选题加10道判断题单选每题2分判断每题2分合计50分剩下50分是编程题。也就是说选择判断题占了整张卷子的半壁江山。经常有学生跟我说“大题我都做了怎么还差几分没过”一看试卷选择题错六道判断题错四道20分就没了。这个分数要是放在编程题里你得完整写出至少两道题才能补回来哪个划算一目了然。1.2 客观题的性价比分析我在带学生时反复强调一个观点编程题水平可以靠刷题慢慢涨但选择判断题的涨分速度是最快的。为什么因为客观题的考点高度固定。GESP六级的大纲范围就那么大数据结构、排序、搜索、图论、动态规划、复杂度分析翻来覆去就那么几十个知识点。你花两周把每类知识点的典型判断题过一遍考场上的熟悉感会非常强。而且客观题的反馈是即时的。编程题写完不知道对不对客观题对就是对错就是错答案在你脑海里能立刻验证。这种高反馈的练习方式特别适合备考中期用来建立信心。所以我给学生的备考节奏一般是前两个月主攻编程题考前一个月开始每天加练半小时客观题效果比从头到尾都啃大题要稳得多。2. 知识点怎么考六大板块出题规律2.1 复杂度与排序看懂那行代码就能拿分复杂度分析是六级选择题的固定开场。几乎每套卷子里都有这么一道题给你一段双层循环或者递归代码问时间复杂度是什么。常见的套路是让你混淆三层循环和两层循环或者在一层循环里嵌一个复杂度为O(n)的操作让你惯性以为整体是O(n²)。比如这种代码for (int i 1; i n; i) for (int j i; j n; j i) cnt;表面看是个两层循环很多人直接写O(n²)实际内层循环的步长是i所以总执行次数是n(1 1/2 1/3 ... 1/n)这是调和级数量级是O(n log n)。这种题考的不是你会不会写代码而是你是不是真的理解循环次数怎么算。排序这个板块的出题方式更偏向性质记忆。高频考点是稳定性以及各种排序的适用场景。冒泡排序、插入排序、归并排序是稳定的选择排序、快速排序、堆排序是不稳定的这个表背下来能直接干掉两三道判断。还有一类问法是给一个情况让你选排序方案比如“数组基本有序用哪种排序最快”答案是插入排序因为它这种情况下能逼近O(n)。2.2 数据结构与存储结构图模型判断题六级的数据结构题不再满足于问你“栈是什么”而是要你在具体场景里判断哪种结构更合适。比如表达式求值用什么结构、函数调用用什么结构、BFS用什么结构这些关系必须刻在脑子里。有一道经典判断题二分查找可以在单链表上实现吗答案是错的。因为二分查找需要随机访问能力链表只能顺序访问就算你维护一个有序链表查找第k个元素也得从头走复杂度退化到O(n)。这个坑翻来覆去地考就是因为很多学生只记住“有序才能二分”忘了还有“随机访问”这个隐藏条件。树这块的考点集中在完全二叉树的数组存储上。假设下标从1开始下标为i的结点的左孩子是2i右孩子是2i1父节点是i/2。这些关系必须熟练到不用想就能写出来。另外已知前序遍历和中序遍历能唯一确定一棵二叉树但如果只给前序和后序一般不能唯一确定因为没有中序信息时左右子树的分界点是模糊的。2.3 图论与搜索陷阱密集区图论是六级选择题里最容易出现长篇描述的板块。出题人会写一段图的应用场景然后问你怎么存储、怎么遍历、怎么求最短路。例如给一个稠密图让你选遍历方案如果用邻接表复杂度反而吃亏用邻接矩阵更合适因为遍历邻接矩阵的复杂度是O(n²)和边数关系不大。DFS和BFS的区别也是判断常客深度优先搜索用栈递归栈或者显式栈广度优先搜索用队列。判断题里经常写“深度优先搜索需要使用队列来记录待访问结点”这就是典型的偷换概念直接打×。路径算法里考察频率较高的是Dijkstra。它的核心是一种贪心策略每一步选当前距离源点最近且未访问过的顶点进行扩展所以不能处理带负权边的图。判断题写“Dijkstra算法可以用于含有负权边的图求最短路”答案是错的。延伸考法还包括稠密图适合朴素DijkstraO(n²)稀疏图适合堆优化版本O((nm)logn)两种写法复杂度不同出题人很喜欢把这两种混在一起让你判断。2.4 动态规划、贪心与递归概念辨析动态规划在六级更多是考概念判断。最核心的两条性质是“最优子结构”和“重叠子问题”。如果一个问题没有重叠子问题用动态规划纯属浪费空间——这种描述就会出现在判断题里提醒你DP和分治的区别。经典考法是01背包和完全背包的一维数组写法。01背包内层循环必须倒序枚举容量目的就是保证每件物品最多取一次完全背包内层循环改成正序表示物品可以重复取。判断题“01背包问题用一维数组优化时外层枚举物品内层倒序枚举容量”为真“完全背包也可以用同样的倒序写法”为假。贪心的判断题套路很固定。题目说“贪心算法总能得到全局最优解”这是错的贪心只保证每一步局部最优能不能得到全局最优要具体情况具体分析。还有“能用贪心解决的问题一定可以用动态规划解决”这也是错的两类算法的适用范围有重叠但不等价。看到“一定”“必定”“所有”这类绝对化词先留个心眼。递归这块考察的是递归与栈的相互转化。任何递归都能用循环加显式栈改写成非递归形式这个命题是真的。但“递归一定比循环慢”是假的因为编译器在有尾递归优化时会处理得很快而且递归代码的意图比循环版本清晰得多。这题只要选项里有绝对化表述通常就是在等着你跳。3. 判断题专训命题人最爱挖的四种坑3.1 绝对化表述判断题的命题规律比选择题好猜得多因为写判断的题目必须让“对”和“错”有明确的区分度。最常见的坑就是绝对化词。“所有”“一定”“必定”“不可能”“永远不会”这些词一出现答案大概率是错的。例如“快速排序在所有情况下都比插入排序快。”这显然是错的。快速排序在数组基本有序时表现远不如插入排序而且它最坏情况就是有序情况附近的输入导致O(n²)。类似的还有“贪心算法一定比动态规划快”“递归深度过大一定会导致栈溢出”后者如果在讨论递归时你会发现它基本是对的但加了“一定”就可能被编译器优化打破。我看到这种题的标准反应是先承认这句话的主干是否正确再看绝对化词是否合理。主干正确但绝对化过度就是典型陷阱。3.2 偷换概念偷换概念是GESP六级判断题的大杀器。例如“栈是一种先进先出的数据结构”把“后进先出”换成“先进先出”“链表的随机访问时间复杂度是O(1)”把“顺序访问”换成了“随机访问”“广度优先搜索使用栈来存储待扩展节点”把“队列”偷成“栈”。应对这类题最笨也最有效的方法是把关键术语先在脑子里翻译成精确的英文或者形式化描述。比如链表访问第k个元素得从头走所以是O(n)数组按下标访问是直接寻址所以是O(1)。术语一旦精确偷换概念就没地方藏了。3.3 C语言细节六级判断里会掺两三道纯语言细节题。容易考到的包括运算符优先级、数组传参退化为指针、函数局部变量存在栈区、new出来的对象在堆区。这类题与其说是考算法不如说是检验基本功。我常跟学生说运算符优先级那几张表必须背下来。新的程序员很容易在写a b c时想当然其实比较运算优先级高于逻辑与所以它和(a b) c等价这是好代码常见的写法。类似地int *p new int[10]; delete[] p;能正确释放数组但如果你写delete p;销毁方式不对。这些细节在平时写题的时候被忽略但它们确实是六级判断的送分题。我建议做个速记表把常见的赋值运算符、算术运算符、比较运算符、逻辑运算符、位运算符的优先级排个序贴在电脑屏幕上每天扫一眼考前基本就不会错了。优先级对照大概是这样最高的是括号、数组下标、成员访问接着是一元运算符、乘法除法、加减法、移位、关系、相等、按位与、异或、或、逻辑与、逻辑或、条件、赋值、逗号。记几个关键边界就行比如赋值比比较低比较比逻辑与高位运算夹在中间。真到了记不清的题直接带一个具体表达式进大脑里推一遍也比瞎蒙强。3.4 算法性质判断算法性质的判断题几乎围绕那几个固定结论展开二分查找的前提是有序和随机访问Dijkstra不能处理负权边快速排序不稳定归并排序空间复杂度O(n)拓扑排序可以用来判断有向图是否存在环并查集路径压缩后时间复杂度接近常数级别。每一个都能出至少一道判断。有个容易被忽略的细节“判断无向图中是否存在回路可以用并查集也可以用DFS。”这句话是对的。并查集在逐个加入边的过程中如果发现某条边连接的两个结点已经在同一集合说明形成了环。DFS则通过检查是否存在回边来判断。两种方法都对题目经常把“只能用并查集”放进来考那就有问题了。4. 考场实战与刷题策略4.1 时间分配与做题顺序六级一共应该有多长时间我记得正常考场上编程题时间是比较充裕的但如果你把时间全部耗在客观题上后面大题容易慌。我的建议是把选择判断题的总时长控制在25分钟以内平均每题1分钟。单选题拿不准的先圈出来跳过去全部写完再回来看。做题顺序按试卷来就好不用刻意调整。但有一点很重要判断题永远不要空着。判断题猜对的概率是50%空着等于白白丢了一半的机会。而且判断题的答案分布通常不会一边倒如果连着五道都是“对”那你不妨回头想想是不是哪里看漏了。4.2 蒙题不裸蒙排除法与特殊值法考场上遇到完全没见过的题不能纯靠手感。两个实操技巧很实用。第一个是特殊值代入尤其是复杂度相关的题直接把n设成1、2、4这种小数字手动模拟一遍循环次数往往能看出大概量级再对应到O(n)、O(n²)、O(n log n)之间的差异。第二个是结构识别选项里描述如果具有明显的算法关键词比如“队列”“栈”“动态规划”就把这个算法最核心的性质写到草稿纸上一个个选项套。单选题排除法更有操作空间。四个选项里如果有两个说法明显自相矛盾或与已知事实冲突排除后正确答案就是二选一。GESP六级的选择题难度没有到竞赛那个程度很多干扰选项都是把概念反着写你只要能把对应知识点的常见错误表述记下来排除起来非常快。4.3 真题错题本备考一个月怎么安排考前一个月是客观题涨分的黄金期我给学生的操作方案是这样的前两周按知识点分类刷题把历年真题和模拟卷里的选择判断按“复杂度排序”“数据结构”“图论搜索”“DP与贪心”“语法细节”五个类型拆分每天集中做一类。你会发现同类型题目的坑都是同一个模子刻出来的刷两三套就能建立条件反射。后两周切换到整套限时训练。每天一套完整的选择判断题限定20分钟做完对答案对错题进行三行复盘第一行写这道题考的知识点第二行写我当时的错误判断第三行写正确判断和理由。错题本不是抄题是归纳你自己的思维偏差。坚持两周正确率基本能稳定在一个相对可观的范围至少不会出现大面积连环错。5. 六组典型真题解析5.1 选择题解析题目一含n个结点的单链表已知某结点的前驱结点删除该结点的时间复杂度是A. O(1) B. O(n) C. O(log n) D. O(n²)答案是A。因为知道了前驱节点直接让前驱的next指针跳过当前节点即可不需要遍历链表。这道题的陷阱在于把“未知前驱”和“已知前驱”混在一起如果题干没给前驱信息标准答案就是O(n)。做题的时候把题干里的条件圈出来这种题不容易错。题目二一棵完全二叉树按顺序存储根节点下标为1某节点的下标是i它的右孩子的下标是A. 2i B. 2i1 C. i1 D. i/2答案是B。这是一个典型的记忆题完全二叉树的数组存储关系非常固定。如果根节点下标从0开始公式会变成左孩子2i1右孩子2i2题目基本都会用从1开始的表述看清下标起点就行。这道题还喜欢变体问法——问父节点下标那就是i/2下取整。题目三下列哪种排序算法是不稳定的A. 归并排序 B. 插入排序 C. 快速排序 D. 冒泡排序答案是C。快速排序在划分过程中会因为交换操作破坏相同元素的相对顺序所以不稳定。这类题在卷子里出现得很频繁四选一的选项基本会把四个稳定性结论各分配一个记住“不稳定家族”是选择、快排、堆排就够了。题目四有n个顶点、m条边的稀疏无向图求单源最短路最适合的Dijkstra实现方式复杂度是A. O(n²) B. O((nm)logn) C. O(n) D. O(nm)答案是B。堆优化的Dijkstra遍历边和更新堆复杂度可以写成O((nm)logn)在稀疏图里比朴素写法O(n²)高效得多。这道题需要理解堆优化的原理不是死记结论。做题时先判断“稀疏图”关键词再联想堆优化。题目五关于递归和栈的说法下列哪一项是正确的A. 递归函数内部使用的是全局变量区 B. 递归调用过程中每次调用都会分配独立的栈帧 C. 递归比循环占用的空间永远更少 D. 递归一定比循环慢答案是B。每次函数调用都会在栈上分配独立的栈帧保存局部变量和返回地址这是递归能保存状态的原因。C和D的“永远”“一定”本身就是破绽。5.2 判断题解析判断一对一个无序数组进行二分查找时间复杂度是O(log n)。答案错误。二分查找的前提是数组有序无序数组必须排序后才能二分而排序本身就要O(n log n)或O(n²)不能直接用O(log n)。这个题的陷阱在于把“有序数组的查找复杂度”偷换到“无序数组”。判断二完全二叉树一定是满二叉树。答案错误。满二叉树是所有层都填满的二叉树完全二叉树只要求最后一层从左到右连续不一定满。反过来“满二叉树一定是完全二叉树”才是对的。判断三用深度优先搜索可以检测有向图中是否存在环。答案正确。DFS通过记录递归栈中结点的访问状态如果遇到一条边从当前结点指向还在递归栈中的结点说明存在环。拓扑排序能判环也是这个原理两者不冲突。判断四数组作为函数参数传递时函数内部修改形参数组不会影响原数组。答案错误。数组作为参数时退化为指针函数通过指针修改的是原数组的内存值会改变。这个坑在C里反复出现很多学生误以为数组和普通变量一样是值传递。判断五并查集采用路径压缩优化后每次查询操作的时间复杂度为常数级别。答案正确。严格来说路径压缩后的并查集非常接近常数的摊还复杂度所以描述成常数级别在竞赛语境下是被认可的。这道题要小心的是别被“每次查询O(1)”的说法迷惑路径压缩写得好时基本就是这样。判断六Dijkstra算法每次从堆中取出未访问结点这个过程体现了贪心策略。答案正确。Dijkstra的核心就是始终从当前最短距离的结点扩展出去这正是贪心思想的体现。但因为贪心无法处理负权边所以只要题目里提到带负权还能用Dijkstra直接给错。6. 带考这几年我总结的几件更要紧的小事第一别小看错题本的作用。我带过的学生里能把客观题错题本坚持写满三十天的人最后那个月正确率基本都在爬升。错题本不需要好看甚至不需要别人看懂关键是每道错题旁边写上“我当时怎么想的”和“实际应该是怎么想的”这个对比才是涨分的关键。只把正确答案抄一遍等于白做。第二模拟练习时建议比真实考场要求更严格一点。限时20分钟做完50分客观题比实际宽松心态更快一步上了考场你就来得及回查拿不准的题。平时我还建议专门练习用排除法做完全没有思路的选择题练得多了蒙对的概率会明显高过纯随机这也是一种能力。第三拿到卷子先快速扫一遍判断题的选项分布。如果前五道全是“正确”第六道大概率会有一处让你拿不准这种时候相信第一直觉不要因为前面的规律强行改答案。考场上最冤的事就是反复修改最后改错了。第四六级的客观题和编程题不是割裂的。你在选择题里见到的复杂度分析、存储结构选择、算法边界条件写编程大题时全部用得上。把客观题当成对算法理解的体检错题暴露出来的薄弱知识点马上回到编程题里去写三五道强化一下比单纯背答案有效得多。最后再说一个我自己比较受用的小操作每道选择题做完不管对错在草稿纸上把题目对应的考点关键词写出来。考前半小时扫一遍这页关键词你会发现整个考点的地图都在脑子里。选择判断题拿分从来不是拼运气而是拼你对知识结构的熟悉程度。把这篇文章里的套路过一遍再配合真题刷上两周六级的客观题就是你的稳定得分区了。