GESP 五级 · GESP 202503 C++ 五级 第 14 题

选择题 · 答案 D

← 整套速查表 GESP 五级 全部真题

题目

函数 int findMax(int arr[], int low, int high) 计算数组中最大元素,其中数组 arr 从索引 low 到 high,( )正确实现了分治逻辑。

A.

if (low == high)
    return arr[low];
int mid = (low + high) / 2;
return arr[mid];

B.

if (low >= high)
    return arr[low];
int mid = (low + high) / 2;
int leftMax = findMax(arr, low, mid - 1);
int rightMax = findMax(arr, mid, high);
return leftMax + rightMax;

C.

if (low > high)
    return 0;
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return leftMax * rightMax;

D.

if (low == high)
    return arr[low];
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return (leftMax > rightMax) ? leftMax : rightMax;
答案:D

解题思维

仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。

常见错误

审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。

详细解析(节选)

【考点】分治策略|递归实现|边界处理

1. 🎯 考纲定位:GESP 三级「递归与分治」模块。命题人卡住的是递归三要素缺失——大量考生只会写 if (low == high) return arr[low]; 直接返回,漏掉分与治两个核心步骤。这道题本质是考你是否真正理解分治算法的完整流程。

2. 🧠 解题思维:看到分治类题目,先想三步:① 何时停止递归(基准情形);② 如何划分(mid 计算方式,注意避免溢出);③ 如何合并(本题是取最大值)。基准情形必须是 low == high 而非 low > high,因为数组非空。划分用 low + (high - low) / 2 而非 (low + high) / 2 防止整数溢出。合并时左右区间为 [low, mid] 和 [mid+1, high],必须用 max 而非 + 或 *。

3. 🪤 陷阱拆解:

4. 🔄 反命题思维:如果把题目改成"求最小值",答案仍是 D,只需把 max 换成 min;如果改成"求和",D 中的合并步骤要改成 leftMax + rightMax。这类题刷到先问自己:这道题到底在考哪个步骤?是基准情形写错、划分越界、还是合并逻辑偷换? 命题人最喜欢在正确答案里塞一个"看起来像对的错误",让你掉进陷阱。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断