各位备考2026年3月GESP三级考试的同学们,我是老马。今天我们来深入分析一个在历年考试中出现频率极高、分值比重较大的考点——枚举算法。
【提交】
https://www.luogu.com.cn/problem/B3957
【问题描述】
小杨同学有一个包含 个非负整数的序列 ,他想要知道其中有多少对下标组合 ,使得 是完全平方数。
如果 是完全平方数,则存在非负整数 使得 。
【输入描述】
第一行一个非负整数 ,表示非负整数个数。
第二行包含 个非负整数 ,表示序列 包含的非负整数。
【输出描述】
输出一个非负整数,表示和是完全平方数的非负整数对数。
【样例输入1】
51 4 3 3 5【样例输出1】
3【样例输入2】
23 5【样例输出2】
0对于全部数据,保证有 ,。
题目要求:统计序列中有多少对元素之和为完全平方数
核心解法:双重循环枚举
for (int i = 1; i < n; i++) {for (int j = i + 1; j <= n; j++) {int s = arr[i] + arr[j];if (int(sqrt(s)) * int(sqrt(s)) == s) { cnt += 1; } }}算法特点:
【提交】
https://www.luogu.com.cn/problem/B4004
【问题描述】
小杨有一个包含 个正整数的序列 ,他想知道是否存在 使得 是序列 中所有数的倍数。
【输入描述】
第一行包含一个正整数 ,代表测试用例组数。
接下来是 组测试用例。
对于每组测试用例,一共两行。其中,第一行包含一个正整数 ;第二行包含 个正整数,代表序列 。
【输出描述】
对于每组测试用例,如果存在 满足对于所有 是 的倍数,输出 Yes,否则输出 No。
【样例输入1】
231 2 451 2 3 4 5【样例输出1】
YesNo【样例解释】
对于第一组数据,对于 ,满足 是 和 的倍数。
【数据范围】
对于全部数据,保证有 。
题目要求:判断是否存在一个元素是所有其他元素的倍数
核心解法:极值枚举+线性验证
int max_v = 0;for (j = 0; j < n; j++) {if (A[j] > max_v) { max_v = A[j]; }}for (j = 0; j < n; j++) {if (max_v % A[j] != 0) {break; }}算法特点:
适用场景:
解题模板:
for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {// 验证(i,j)组合是否满足条件if (checkCondition(arr[i], arr[j])) { count++; } }}适用场景:
解题模板:
// 预处理:查找极值、排序、建立索引等int candidate = findCandidate(arr, n);// 线性验证for (int i = 0; i < n; i++) {if (!isValid(candidate, arr[i])) {returnfalse; }}基于2023-2025年的命题规律,我认为2026年3月的枚举算法题目将呈现以下特点:
第一阶段(现在-1月底):基础夯实
第二阶段(2月初-2月中旬):真题训练
第三阶段(2月下旬-3月初):模拟冲刺
第四阶段(考前一周):心理调整
max_val、pair_count)break,提高效率// 调试技巧:输出中间结果for (int i = 1; i < n; i++) {for (int j = i + 1; j <= n; j++) {int s = arr[i] + arr[j];int root = int(sqrt(s));cout << "检查对(" << i << "," << j << "): " << arr[i] << "+" << arr[j] << "=" << s;cout << " 平方根=" << root << " 验证=" << root*root << endl;if (root * root == s) { cnt += 1; } }}枚举算法是GESP三级考试的基础得分点,也是区分考生编程能力的重要标尺。通过系统掌握完全枚举和优化枚举两种模式,同学们可以在考试中游刃有余。
记住老马的三句备考箴言:
相信通过认真准备,大家一定能在2026年3月的考试中取得优异成绩!
青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
