GESP 六级真题完整题单分析
题目编号 | 完整题目标题 | 难度 | 考点解析 | 解题思路 |
---|---|---|---|---|
P10250 | [GESP样题 六级] 下楼梯 | 普及− | 动态规划、递推关系 | 1. dp[i]表示到第i级台阶的方法数 2. dp[i] = dp[i-1] + dp[i-2] + dp[i-3] 3. 边界dp[0]=1, dp[1]=1 |
P10262 | [GESP样题 六级] 亲朋数 | 普及/提高− | 数论、因数性质 | 1. 计算数的真因数之和 2. 检查是否为亲和数对 3. 统计区间内亲和数 |
B3873 | [GESP202309 六级] 小杨买饮料 | 普及/提高− | 动态规划、完全背包 | 1. dp[i]表示花费i元的最大满足度 2. 状态转移:dp[i] = max(dp[i], dp[i-cost] + value) |
B3874 | [GESP202309 六级] 小杨的握手问题 | 普及/提高− | 组合数学、图论 | 1. 计算组合数C(n,2) 2. 减去不能握手的对数 3. 特殊处理约束条件 |
P10108 | [GESP202312 六级] 闯关游戏 | 普及− | 拓扑排序、依赖解析 | 1. 构建关卡依赖图 2. 计算节点入度 3. 队列处理入度0节点 4. 判断能否完成所有关卡 |
P10109 | [GESP202312 六级] 工作沟通 | 普及− | 最近公共祖先(LCA)、树结构 | 1. 构建公司树结构 2. 预处理LCA 3. 查询两个员工的最短沟通路径 |
P10376 | [GESP202403 六级] 游戏 | 普及− | 贪心策略、任务调度 | 1. 按结束时间排序任务 2. 选择最早结束的任务 3. 更新当前时间 |
P10377 | [GESP202403 六级] 好斗的牛 | 普及− | 二分答案、贪心验证 | 1. 二分查找最小间距 2. 验证给定间距能否放置所有牛 3. 调整左右边界 |
P10721 | [GESP202406 六级] 计算得分 | 普及/提高− | 区间DP、最优决策 | 1. dp[i][j]表示区间[i,j]最大得分 2. 枚举分割点k:dp[i][j]=max(dp[i][k]+dp[k+1][j]+score) |
P10722 | [GESP202406 六级] 二叉树 | 普及/提高− | 树形结构、遍历序列 | 1. 根据前序+中序重建二叉树 2. 递归构建左右子树 3. 输出后序遍历序列 |
P11246 | [GESP202409 六级] 小杨和整数拆分 | 普及− | 动态规划、拆分数 | 1. dp[i][j]表示i拆分为最大数为j的方案数 2. 状态转移:dp[i][j] = dp[i][j-1] + dp[i-j][j] |
P11247 | [GESP202409 六级] 算法学习 | 普及/提高− | 状态压缩DP、子集枚举 | 1. dp[mask]表示掌握算法集合mask的最小时间 2. 枚举子集进行状态转移 |
P11375 | [GESP202412 六级] 树上游走 | 普及− | 树形DP、最长路径 | 1. DFS遍历树结构 2. 维护节点深度 3. 计算直径 = 最深叶子 + 次深叶子 |
P11376 | [GESP202412 六级] 运送物资 | 普及/提高− | 网络流、最小割 | 1. 构建网络流图 2. Edmons-Karp算法求最大流 3. 输出最小割容量 |
P11962 | [GESP202503 六级] 树上漫步 | 普及− | 欧拉序、树结构 | 1. DFS生成欧拉序 2. 查询两点距离 = depth[u] + depth[v] - 2*depth[LCA] |
P11963 | [GESP202503 六级] 环线 | 普及/提高− | 基环树、拓扑排序 | 1. 拓扑排序识别环 2. 处理环上节点 3. 处理树枝节点 |
P13015 | [GESP202506 六级] 学习小组 | 普及− | 二分图匹配、匈牙利算法 | 1. 构建学生-小组二分图 2. DFS寻找增广路径 3. 统计最大匹配数 |
P13016 | [GESP202506 六级] 最大因数 | 普及/提高− | 数论、因数分解 | 1. 分解质因数 2. 找最大质因数 3. 特殊处理平方因子 |
六级核心考点分布
考点类别 | 覆盖题数 | 高频题型 | 关键实现方法 |
---|---|---|---|
动态规划 | 7题 | 下楼梯、计算得分、整数拆分 | 状态转移方程、记忆化搜索 |
树形结构 | 6题 | 工作沟通、二叉树、树上游走 | DFS遍历、LCA、树形DP |
图论算法 | 5题 | 闯关游戏、运送物资、环线 | 拓扑排序、网络流、基环树处理 |
数论与数学 | 4题 | 亲朋数、最大因数 | 因数分解、质因数处理 |
二分算法 | 3题 | 好斗的牛、学习小组 | 二分答案、匈牙利算法 |
六级必备代码模板
1. 拓扑排序
bool topologicalSort(int n, vector<int> graph[], vector<int>& result) {
vector<int> indegree(n+1, 0);
queue<int> q;
// 计算入度
for(int i=1; i<=n; i++)
for(int neighbor : graph[i])
indegree[neighbor]++;
// 入度为0节点入队
for(int i=1; i<=n; i++)
if(indegree[i] == 0) q.push(i);
// 处理队列
while(!q.empty()) {
int cur = q.front(); q.pop();
result.push_back(cur);
for(int neighbor : graph[cur]) {
if(--indegree[neighbor] == 0) {
q.push(neighbor);
}
}
}
return result.size() == n;
}
2. 树形DP(树直径)
int diameter = 0;
int dfsDiameter(int u, int parent, vector<int> tree[]) {
int maxDepth = 0, secondMax = 0;
for(int v : tree[u]) {
if(v == parent) continue;
int depth = dfsDiameter(v, u, tree) + 1;
if(depth > maxDepth) {
secondMax = maxDepth;
maxDepth = depth;
} else if(depth > secondMax) {
secondMax = depth;
}
}
diameter = max(diameter, maxDepth + secondMax);
return maxDepth;
}
3. 二分答案(好斗的牛)
bool check(int minDist, vector<int>& positions, int c) {
int count = 1, last = positions[0];
for(int i=1; i<positions.size(); i++) {
if(positions[i] - last >= minDist) {
count++;
last = positions[i];
if(count >= c) return true;
}
}
return false;
}
int maxMinDist(vector<int>& positions, int c) {
sort(positions.begin(), positions.end());
int left = 1, right = positions.back() - positions.front();
while(left < right) {
int mid = (left + right + 1) / 2;
if(check(mid, positions, c)) left = mid;
else right = mid - 1;
}
return left;
}
4. 二叉树重建
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preStart, int preEnd, int inStart, int inEnd) {
if(preStart > preEnd) return nullptr;
int rootVal = preorder[preStart];
int rootIndex = -1;
for(int i=inStart; i<=inEnd; i++) {
if(inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
int leftSize = rootIndex - inStart;
TreeNode* root = new TreeNode(rootVal);
root->left = buildTree(preorder, inorder, preStart+1, preStart+leftSize, inStart, rootIndex-1);
root->right = buildTree(preorder, inorder, preStart+leftSize+1, preEnd, rootIndex+1, inEnd);
return root;
}
六级易错点及解决方案
-
树形结构递归爆栈(出现率60%)
- 场景:大型树结构遍历
- 方案:显式栈实现DFS
- 优化:设置递归深度限制
-
图论边界条件(出现率70%)
- 场景:网络流、拓扑排序
- 方案:测试空图、单节点图等特殊情况
- 验证:小规模数据手工计算验证
-
DP状态转移错误(出现率65%)
- 场景:区间DP、树形DP
- 方案:打印DP表调试
- 预防:明确状态定义,写伪代码再实现
-
二分答案验证函数(出现率50%)
- 场景:好斗的牛、学习小组
- 方案:单独测试验证函数
- 边界:测试最小/最大可能值