GESP 一级到八级最具参考性题目及知识点详解
以下按级别整理经典题目,涵盖核心知识点与详细解析,适合系统化备考。
GESP 一级(编程入门)
知识点:变量、输入输出、顺序结构、简单算术运算。
典型题目:计算两个整数的和。
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
解析:
-
考点:基本输入输出、变量定义与算术运算。
-
易错点:未初始化变量、输入格式错误。
GESP 二级(分支与循环)
知识点:if-else、for/while循环、数组基础。
典型题目:输入一个数组,逆序输出。
#include <iostream>
using namespace std;
int main() {
int n, a[100];
cin >> n;
for (int i=0; i<n; i++) cin >> a[i];
for (int i=n-1; i>=0; i--) cout << a[i] << " ";
return 0;
}
解析:
-
考点:循环控制、数组索引反向遍历。
-
陷阱:数组越界(如
i从n开始)。
GESP 三级(函数与递归)
知识点:函数定义、递归调用、简单数学问题。
典型题目:递归计算阶乘。
#include <iostream>
using namespace std;
int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n-1);
}
int main() {
int n;
cin >> n;
cout << factorial(n);
return 0;
}
解析:
-
考点:递归终止条件、函数参数传递。
-
优化:递归改为迭代避免栈溢出。
GESP 四级(数据结构基础)
知识点:字符串处理、栈与队列、简单结构体。
典型题目:判断括号是否合法。
#include <iostream>
#include <stack>
using namespace std;
bool isValid(string s) {
stack<char> st;
for (char c : s) {
if (c == '(') st.push(')');
else if (st.empty() || st.top() != c) return false;
else st.pop();
}
return st.empty();
}
int main() {
string s;
cin >> s;
cout << (isValid(s) ? "YES" : "NO");
return 0;
}
解析:
-
考点:栈的LIFO特性处理括号匹配。
-
边界条件:空字符串、单边括号数量不匹配。
GESP 五级(排序与搜索)
知识点:快速排序、二分查找、简单贪心。
典型题目:实现快速排序。
#include <iostream>
using namespace std;
void quickSort(int a[], int l, int r) {
if (l >= r) return;
int i = l, j = r, pivot = a[(l + r) / 2];
while (i <= j) {
while (a[i] < pivot) i++;
while (a[j] > pivot) j--;
if (i <= j) swap(a[i++], a[j--]);
}
quickSort(a, l, j);
quickSort(a, i, r);
}
int main() {
int a[] = {3,1,4,1,5,9,2,6};
quickSort(a, 0, 7);
for (int i=0; i<8; i++) cout << a[i] << " ";
return 0;
}
解析:
-
考点:分治思想、递归终止条件。
-
优化:随机选择基准避免最坏时间复杂度。
GESP 六级(图论基础)
知识点:邻接表、DFS/BFS、最短路径。
典型题目:Dijkstra算法求单源最短路径。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1e9;
vector<pair<int, int>> graph[100];
int dist[100];
void dijkstra(int start) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
fill(dist, dist + 100, INF);
dist[start] = 0;
pq.emplace(0, start);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto [v, w] : graph[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.emplace(dist[v], v);
}
}
}
}
int main() {
// 构建图并调用 dijkstra
return 0;
}
解析:
-
考点:优先队列优化、松弛操作。
-
陷阱:负权边无法处理(需用SPFA)。
GESP 七级(动态规划)
知识点:背包问题、状态压缩、树形DP。
典型题目:0-1背包问题。
#include <iostream>
using namespace std;
int knapsack(int W, int wt[], int val[], int n) {
int dp[1001] = {0};
for (int i=0; i<n; i++)
for (int j=W; j>=wt[i]; j--)
dp[j] = max(dp[j], dp[j - wt[i]] + val[i]);
return dp[W];
}
int main() {
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
cout << knapsack(50, wt, val, 3); // 输出220
return 0;
}
解析:
-
考点:状态转移方程
dp[j] = max(dp[j], dp[j - wt[i]] + val[i])。 -
优化:滚动数组压缩空间复杂度。
GESP 八级(高级算法)
知识点:网络流、线段树、复杂状态压缩。
典型题目:最大流问题(Edmonds-Karp算法)。
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 100, INF = 1e9;
int cap[N][N], parent[N];
int bfs(int s, int t) {
memset(parent, -1, sizeof(parent));
parent[s] = -2;
queue<pair<int, int>> q;
q.push({s, INF});
while (!q.empty()) {
auto [u, flow] = q.front(); q.pop();
for (int v=0; v<N; v++) {
if (parent[v] == -1 && cap[u][v] > 0) {
parent[v] = u;
int new_flow = min(flow, cap[u][v]);
if (v == t) return new_flow;
q.push({v, new_flow});
}
}
}
return 0;
}
int maxFlow(int s, int t) {
int flow = 0, new_flow;
while ((new_flow = bfs(s, t)) {
flow += new_flow;
for (int v=t; v!=s; v=parent[v]) {
int u = parent[v];
cap[u][v] -= new_flow;
cap[v][u] += new_flow;
}
}
return flow;
}
int main() {
// 初始化 cap 数组并调用 maxFlow
return 0;
}
解析:
-
考点:BFS寻找增广路径、残余网络更新。
-
优化:Dinic算法提升效率。
总结
-
备考建议:从低级到高级逐步掌握知识点,重点练习动态规划和图论。
-
刷题资源:GESP官网样题、Codeforces EDU专题、洛谷题库。
707

被折叠的 条评论
为什么被折叠?



