彭彭老师
题型一:字符串处理
典型真题:小杨的字典(4031)、相似字符串(4047)
核心套路:逐字符扫描 + 状态记录
cpp
// 模板:按字符类型分类处理
for (int i = 0; i < s.size(); i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
// 字母:拼接到当前单词
} else {
// 标点/分隔符:处理之前积累的单词,然后输出该字符
}
}
// ️ 别忘了处理末尾遗留的单词
易错点:末尾无分隔符时漏处理最后一个单词;空单词的边界判断。
题型二:排序 + 贪心
典型真题:田忌赛马(4032)、做题(4048)
核心套路:先排序,再贪心匹配
cpp
// 模板:排序 + 贪心匹配
sort(a, a + n);
int day = 1; // 或 wins = 0
for (int i = 0; i < n; i++) {
if (a[i] >= day) { // 能满足当前需求
day++; // 或 wins++
}
}
cout << day - 1 << endl;
口诀:先排序,再配对;能赢就赢,赢不了就送掉。
题型三:模拟算法
典型场景:填幻方、变长编码、Recamán 序列、递推构造序列
核心套路:严格按题目描述一步步实现
cpp
// 模板:递推/构造序列
a[1] = 1;
for (int i = 2; i <= n; i++) {
if (/* 满足条件 */) {
a[i] = /* 规则1 */;
} else {
a[i] = /* 规则2 */;
}
}
口诀:题目说啥你干啥,变量别乱改,样例手动算一遍。
题型四:数论基础
典型场景:素数判断、绝对素数、进制转换
cpp
// 模板:素数判断 O(√n)
bool isPrime(int n) {
if (n <= 1) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) return false;
}
return true;
}
易错点 :循环到 √n 而非 n,否则大数据会超时。
题型五:二维数组 / 矩阵
典型场景:画布裁剪、图像压缩、黑白方块、矩阵运算
cpp
// 模板:矩阵遍历
for (int i = 0; i < n; i++) { // 外层:行
for (int j = 0; j < m; j++) { // 内层:列
// 处理 matrix[i][j]
}
}
// 主对角线:matrix[i][i]
// 副对角线:matrix[i][n-1-i]
易错点:行列越界、中心元素重复计算。
题型六:编辑距离 / 双指针
典型真题:相似字符串(4047)
核心套路:根据长度差分情况讨论
| 长度差 | 允许操作 | 判断方法 |
|---|---|---|
| > 1 | 不可能 | 直接 false |
| = 0 | 替换 | 统计不同字符数 ≤ 1 |
| = 1 | 插入/删除 | 双指针,允许跳过较长串一个字符 |
通用解题流程
- 先看样例,手动模拟一遍输入输出
- 识别题型:字符串?贪心?模拟?数论?
- 拆小步骤,分步写代码
- 注意边界:数组开够大小、末尾处理、空值判断
- 测完样例再测边界:n=1、全相同、全不同
️ 高频易错点汇总
| 易错点 | 说明 |
|---|---|
| 数组越界 | N=10⁶ 时数组要开到 10⁶+5 |
| 整数溢出 | 大数累加用 long long |
| 末尾漏处理 | 循环结束后检查缓冲区是否非空 |
| 排序后忘用 | 贪心题一定要先排序 |
| 输出多/少 1 | day++ 后循环结束,输出要 day-1 |
这份速查表基本覆盖了 GESP 四级上机题 90% 以上的考点。建议考前过一遍模板,重点练习字符串处理 和排序+贪心这两类,它们出现频率最高。