GESP 五级 · GESP 202606 C++ 五级 第 9 题

选择题 · 答案 C · 考点:二分查找

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

题目

在一个有序数组中查找第一个大于或等于 $x$ 的元素位置,横线处应填写( )。

int lowerBound(vector<int>& a, int x) {
    int l = 0, r = a.size();
    while (l < r) {
        int mid = l + (r - l) / 2;
        if (a[mid] >= x) ________________; // 在此处填入代码
        else l = mid + 1;
    }
    return l;
}
答案:C

考点

二分查找 讲解 →二分查找 真题汇总 →

解题思维

根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。

常见错误

填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。

详细解析(节选)

【考点】二分查找|有序数组|区间收缩

看到lowerBound模板,第一反应是二分。有序数组+找第一个≥x,典型的二分区间收缩题。

解题链:l=0, r=n(开区间)。mid若满足条件,答案在[mid, r)内,所以r=mid;不满足则答案在[l, mid+1)内,所以l=mid+1。这样l、r最终收敛到第一个≥x的下标。

陷阱:A的r=mid+1会让区间右扩,B的r=mid-1会越过正确答案,D的l=mid则可能死循环。命题人卡住的是对lowerBound与upperBound的边界理解——lowerBound是"第一个≥",upperBound是"第一个>",两者区间收缩方向相反。

反命题:若改成upperBound,条件判为a[mid]>x,横线填r=mid;若数组无序,二分直接失效;若x不存在,返回a.size()。刷到这类题先问"它在考二分还是考边界语义"。

同考点真题

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