GESP 七级真题完整题单分析
题目编号 | 完整题目标题 | 难度 | 考点解析 | 解题思路 |
---|---|---|---|---|
P10265 | [GESP样题 七级] 迷宫统计 | 普及− | 图论、连通块分析 | 1. DFS/BFS遍历所有连通区域 2. 统计不同大小迷宫数量 3. 输出统计结果 |
P10287 | [GESP样题 七级] 最长不下降子序列 | 普及/提高− | 动态规划、树状数组 | 1. DP[i]表示以i结尾的最长序列 2. 使用树状数组优化转移 3. 输出全局最大值 |
P10110 | [GESP202312 七级] 商品交易 | 普及/提高− | 图论、最短路 | 1. 构建商品交换图 2. Dijkstra求最大汇率路径 3. 输出最佳兑换链 |
P10111 | [GESP202312 七级] 纸牌游戏 | 普及/提高− | 博弈论、极大极小搜索 | 1. 递归实现极大极小算法 2. α-β剪枝优化 3. 评估局面分值 |
P10378 | [GESP202403 七级] 交流问题 | 普及/提高− | 网络流、最大流 | 1. 构建通信网络流图 2. Dinic算法求最大流 3. 输出最小割容量 |
P10379 | [GESP202403 七级] 俄罗斯方块 | 普及/提高− | 模拟、状态预测 | 1. 枚举方块旋转状态 2. 预测下落位置 3. 评估消除行数 |
P10723 | [GESP202406 七级] 黑白翻转 | 普及+/提高 | 状态压缩、双向BFS | 1. 棋盘状态编码为整数 2. 双向BFS搜索 3. 记录最短路径 |
P10724 | [GESP202406 七级] 区间乘积 | 普及+/提高 | 线段树、区间查询 | 1. 构建线段树 2. 支持区间乘积查询 3. 处理模运算 |
P11248 | [GESP202409 七级] 矩阵移动 | 普及− | 矩阵变换、坐标映射 | 1. 计算旋转/平移后坐标 2. 映射元素位置 3. 输出新矩阵 |
P11249 | [GESP202409 七级] 小杨寻宝 | 普及/提高− | 状态压缩BFS、位运算 | 1. 状态:位置+钥匙收集状态 2. BFS遍历所有状态 3. 找最短路径 |
P11377 | [GESP202412 七级] 武器购买 | 普及− | 背包DP、依赖关系 | 1. 处理装备依赖树 2. 树形背包DP 3. 输出最大战力 |
P11378 | [GESP202412 七级] 燃烧 | 普及/提高− | 图论、传递闭包 | 1. Floyd-Warshall算法 2. 计算燃烧传递关系 3. 统计安全点 |
P11964 | [GESP202503 七级] 图上移动 | 普及/提高− | 概率DP、期望计算 | 1. DP[i]表示从i到终点的期望步数 2. 状态转移:DP[i]=Σ(DP[j]+1)/deg(i) |
P11965 | [GESP202503 七级] 等价消除 | 普及/提高− | 字符串处理、栈操作 | 1. 栈模拟消除过程 2. 定义等价关系 3. 输出最终字符串 |
P13017 | [GESP202506 七级] 线图 | 普及/提高− | 图论、线图转换 | 1. 原图边转为线图顶点 2. 处理邻接关系 3. 输出线图属性 |
P13018 | [GESP202506 七级] 调味平衡 | 普及/提高− | 折半搜索、哈希映射 | 1. 分割调料集合 2. 枚举所有组合 3. 哈希记录互补值 |
七级核心考点分布
考点类别 | 覆盖题数 | 高频题型 | 关键实现方法 |
---|---|---|---|
图论算法 | 9题 | 商品交易、交流问题、线图 | 最短路、网络流、图转换 |
动态规划 | 6题 | 最长子序列、图上移动、武器购买 | 状态压缩DP、概率DP、树形背包 |
搜索算法 | 5题 | 迷宫统计、小杨寻宝、黑白翻转 | BFS、双向BFS、状态压缩搜索 |
数据结构 | 4题 | 区间乘积、等价消除 | 线段树、栈操作 |
数学与计算 | 3题 | 矩阵移动、调味平衡 | 坐标变换、折半搜索 |
七级必备代码模板
1. Dijkstra最短路(商品交易)
const int MAX = 1005;
double dist[MAX];
vector<pair<int, double>> graph[MAX];
void dijkstra(int start) {
fill(dist, dist+MAX, 0.0);
dist[start] = 1.0;
priority_queue<pair<double, int>> pq;
pq.push({1.0, start});
while(!pq.empty()) {
auto [rate, u] = pq.top(); pq.pop();
if(fabs(rate - dist[u]) > 1e-9) continue;
for(auto [v, r] : graph[u]) {
double newRate = rate * r;
if(newRate > dist[v]) {
dist[v] = newRate;
pq.push({newRate, v});
}
}
}
}
2. 树形背包DP(武器购买)
int dp[MAX][MAX]; // dp[u][j]: 以u为根花费j的最大战力
vector<int> children[MAX];
int cost[MAX], power[MAX];
void dfs(int u, int budget) {
for(int j = cost[u]; j <= budget; j++)
dp[u][j] = power[u];
for(int v : children[u]) {
dfs(v, budget);
for(int j = budget; j >= cost[u]; j--) {
for(int k = 0; k <= j - cost[u]; k++) {
dp[u][j] = max(dp[u][j], dp[u][j-k] + dp[v][k]);
}
}
}
}
3. 状态压缩BFS(小杨寻宝)
struct State {
int x, y; // 位置
int keys; // 钥匙状态
int steps; // 步数
};
int bfs(vector<string>& grid) {
queue<State> q;
bool vis[50][50][1<<5] = {false}; // 三维状态记录
// 初始化起点
q.push({startX, startY, 0, 0});
vis[startX][startY][0] = true;
while(!q.empty()) {
State cur = q.front(); q.pop();
if(cur.keys == fullKeySet && grid[cur.x][cur.y]=='E')
return cur.steps;
for(移动方向) {
int nx = cur.x + dx, ny = cur.y + dy;
if(无效位置) continue;
char c = grid[nx][ny];
int newKeys = cur.keys;
if(是钥匙) newKeys |= (1 << keyIndex);
if(需要钥匙但未持有) continue;
if(!vis[nx][ny][newKeys]) {
vis[nx][ny][newKeys] = true;
q.push({nx, ny, newKeys, cur.steps+1});
}
}
}
return -1;
}
4. 线段树(区间乘积)
const int MOD = 1e9+7;
int tree[4*MAXN], arr[MAXN];
void build(int node, int start, int end) {
if(start == end) {
tree[node] = arr[start];
} else {
int mid = (start+end)/2;
build(2*node, start, mid);
build(2*node+1, mid+1, end);
tree[node] = (1LL * tree[2*node] * tree[2*node+1]) % MOD;
}
}
int query(int node, int start, int end, int l, int r) {
if(r < start || end < l) return 1;
if(l <= start && end <= r) return tree[node];
int mid = (start+end)/2;
int leftProd = query(2*node, start, mid, l, r);
int rightProd = query(2*node+1, mid+1, end, l, r);
return (1LL * leftProd * rightProd) % MOD;
}
七级易错点及解决方案
-
浮点精度问题(出现率60%)
- 场景:商品交易、概率计算
- 方案:使用double类型,避免直接比较浮点数
- 比较方法:
fabs(a-b) < 1e-9
-
状态空间过大(出现率70%)
- 场景:状态压缩BFS、DP
- 方案:优化状态表示,使用哈希压缩
- 技巧:位运算压缩状态
-
模运算错误(出现率50%)
- 场景:区间乘积、组合计数
- 方案:每次乘除后取模
- 公式:
(a * b) % MOD = ((a % MOD) * (b % MOD)) % MOD
-
图论算法效率(出现率65%)
- 场景:网络流、最短路
- 方案:选择合适算法(Dijkstra vs SPFA)
- 优化:使用堆优化Dijkstra