GESP 五级真题完整题单分析
题目编号 | 完整题目标题 | 难度 | 考点解析 | 解题思路 |
---|---|---|---|---|
B3941 | [GESP样题 五级] 小杨的锻炼 | 普及− | 模拟、时间管理 | 1. 按优先级排序锻炼项目 2. 循环分配时间段 3. 输出每日锻炼计划 |
B3951 | [GESP样题 五级] 小杨的队列 | 普及− | 队列操作、动态维护 | 1. 数组模拟循环队列 2. 处理入队/出队操作 3. 维护队列中位数 |
B3871 | [GESP202309 五级] 因数分解 | 普及− | 质因数分解、指数统计 | 1. 试除法分解质因数 2. 统计质因数指数 3. 格式化输出分解结果 |
B3872 | [GESP202309 五级] 巧夺大奖 | 普及/提高− | 贪心策略、背包变体 | 1. 按价值/体积比排序奖品 2. 优先选择高性价比奖品 3. 特殊处理大体积奖品 |
B3929 | [GESP202312 五级] 小杨的幸运数 | 普及/提高− | 数位处理、动态规划 | 1. DP统计满足条件的数字 2. 状态:位置、数位和、是否受限 3. 记忆化搜索实现 |
B3930 | [GESP202312 五级] 烹饪问题 | 普及/提高− | 状态压缩、位运算 | 1. 用二进制表示食材组合 2. 枚举所有组合计算美味值 3. 找最大美味值组合 |
B3968 | [GESP202403 五级] 成绩排序 | 普及− | 多关键字排序 | 1. 主关键字:总分降序 2. 次关键字:语文降序 3. 稳定排序保持原始顺序 |
B3969 | [GESP202403 五级] B-smooth 数 | 普及− | 质因数分解、最大值约束 | 1. 分解质因数 2. 检查所有质因数≤B 3. 统计区间内B-smooth数数量 |
P10719 | [GESP202406 五级] 黑白格 | 普及/提高− | 连通块分析、DFS | 1. DFS/BFS找连通块 2. 统计黑白块数量 3. 计算最大连通块 |
P10720 | [GESP202406 五级] 小杨的幸运数字 | 普及− | 数位处理、条件判断 | 1. 分离数字各位 2. 检查奇偶位关系 3. 统计幸运数字数量 |
B4050 | [GESP202409 五级] 挑战怪物 | 普及/提高− | 贪心策略、优先级调度 | 1. 按威胁值/血量比排序怪物 2. 优先解决高威胁怪物 3. 计算最小消耗 |
B4051 | [GESP202409 五级] 小杨的武器 | 普及− | 分组背包、动态规划 | 1. 按武器类型分组 2. 组内排序 3. 组间DP选择最优组合 |
B4070 | [GESP202412 五级] 奇妙数字 | 普及/提高− | 数论性质、模运算 | 1. 验证数字的数学性质 2. 特殊处理大数 3. 统计区间内奇妙数字 |
B4071 | [GESP202412 五级] 武器强化 | 普及/提高− | 期望计算、概率DP | 1. DP状态:强化等级、剩余材料 2. 状态转移计算期望 3. 记忆化搜索优化 |
P11960 | [GESP202503 五级] 平均分配 | 普及/提高− | 子集和问题、折半搜索 | 1. 分割数组为两半 2. 分别枚举子集和 3. 双指针找目标和 |
P11961 | [GESP202503 五级] 原根判断 | 提高+/省选− | 数论、原根性质 | 1. 分解φ(m)的质因数 2. 验证g^(φ(m)/pi) ≠ 1 (mod m) 3. 判断原根存在性 |
P13013 | [GESP202506 五级] 奖品兑换 | 普及/提高− | 贪心策略、组合优化 | 1. 按性价比排序奖品 2. 优先兑换高性价比奖品 3. 特殊处理积分余数 |
P13014 | [GESP202506 五级] 最大公因数 | 普及− | 数论、因数性质 | 1. 枚举公因数d 2. 验证所有数可被d整除 3. 找最大满足条件的d |
五级核心考点分布
考点类别 | 覆盖题数 | 高频题型 | 关键实现方法 |
---|---|---|---|
动态规划 | 7题 | 武器强化、小杨的幸运数 | 状态转移方程、记忆化搜索 |
贪心策略 | 6题 | 巧夺大奖、挑战怪物、奖品兑换 | 性价比排序、最优选择 |
数论与数学 | 8题 | 因数分解、原根判断、奇妙数字 | 质因数分解、模运算、数位处理 |
搜索算法 | 5题 | 烹饪问题、黑白格、平均分配 | DFS/BFS、折半搜索 |
数据结构 | 4题 | 小杨的队列、成绩排序 | 队列模拟、多关键字排序 |
五级必备代码模板
1. 质因数分解
void factorize(int n) {
for(int i=2; i*i<=n; i++) {
if(n%i == 0) {
int cnt = 0;
while(n%i == 0) {
cnt++;
n /= i;
}
cout << i << "^" << cnt << " ";
}
}
if(n > 1) cout << n << "^1";
}
2. 分组背包DP
const int MAX = 105;
int dp[MAX]; // dp[j]表示容量j的最大价值
struct Group {
vector<pair<int, int>> items; // (体积, 价值)
};
for(auto &group : groups) {
for(int j = V; j >= 0; j--) {
for(auto &item : group.items) {
if(j >= item.first) {
dp[j] = max(dp[j], dp[j-item.first] + item.second);
}
}
}
}
3. 折半搜索(平均分配)
vector<int> generateSums(vector<int>& nums) {
vector<int> sums;
int n = nums.size();
for(int mask = 0; mask < (1<<n); mask++) {
int sum = 0;
for(int i=0; i<n; i++) {
if(mask & (1<<i)) sum += nums[i];
}
sums.push_back(sum);
}
return sums;
}
bool canPartition(vector<int>& nums) {
int total = accumulate(nums.begin(), nums.end(), 0);
if(total % 2 != 0) return false;
int half = total/2;
int n = nums.size();
int mid = n/2;
vector<int> left = vector<int>(nums.begin(), nums.begin()+mid);
vector<int> right = vector<int>(nums.begin()+mid, nums.end());
vector<int> leftSums = generateSums(left);
vector<int> rightSums = generateSums(right);
sort(rightSums.begin(), rightSums.end());
for(int sum : leftSums) {
if(sum > half) continue;
auto it = lower_bound(rightSums.begin(), rightSums.end(), half-sum);
if(it != rightSums.end() && *it == half-sum) return true;
}
return false;
}
4. 队列模拟
class ArrayQueue {
int arr[1005];
int front, rear;
public:
ArrayQueue() : front(0), rear(0) {}
void push(int x) {
arr[rear++] = x;
}
int pop() {
return arr[front++];
}
int getMedian() {
vector<int> temp(arr+front, arr+rear);
sort(temp.begin(), temp.end());
return temp[temp.size()/2];
}
};
五级易错点及解决方案
-
DP状态设计错误(出现率70%)
- 场景:小杨的幸运数、武器强化
- 方案:明确状态定义(位置、限制条件、辅助状态)
- 调试:打印DP表检查中间状态
-
贪心策略失效(出现率50%)
- 场景:巧夺大奖、挑战怪物
- 方案:反证法验证贪心正确性,准备备用方案
- 特殊测试:极端数据测试(全小物品/全大物品)
-
数论边界处理(出现率60%)
- 场景:原根判断、B-smooth数
- 方案:单独处理0/1特殊情况
- 验证:小数据暴力验证
-
大数运算溢出(出现率40%)
- 场景:因数分解、奇妙数字
- 方案:使用
long long
类型 - 检测:检查中间结果是否超
10^9