林老师 · 客观题题库 · 第 12 章 查找 · 知识细节练习

第 12 章 查找 · 知识细节练习

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-第12章查找-知识细节练习
题目总数100 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 16 大部分,合计 100 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

顺序查找基本概念

7 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

判断题:顺序查找(线性查找)= 从数组第一个元素开始,逐个与目标值比较,直到找到目标或查完整个数组为止。

(1 分)
第 2 题 A2 未作答

判断题:当数据无序、数据量较小、或数据存放在链表上(无法随机访问)时,顺序查找是合适的选择。

(1 分)
第 3 题 A3 未作答

单选题:在 nn 个元素的数组中顺序查找某个值,最坏情况下需要比较多少次?

(1 分)
第 4 题 A4 未作答

单选题:在 nn 个元素中顺序查找,且一定能找到(目标均匀分布在各位置),平均比较次数约为?

(1 分)
第 5 题 A5 未作答

判断题:C++ 数组下标从 00 开始:a[0] 是第一个元素,循环 for (int i = 0; i < n; i++) 恰好访问全部 nn 个元素。

(1 分)
第 6 题 A6 未作答

判断题:链表不支持随机访问(不能直接跳到中间节点),因此在链表上查找某个值只能用顺序查找——从头节点开始逐个向后走。

(1 分)
第 7 题 A7 未作答

单选题:关于顺序查找与二分查找,下列说法正确的是?

(1 分)

二分查找基本概念

7 QUESTIONS · 2 POINTS EACH
第 8 题 B1 未作答

判断题:二分查找的基本思想:每次取当前区间的中间元素与目标比较,根据比较结果把查找区间缩小一半,直到找到目标或区间为空。

(1 分)
第 9 题 B2 未作答

单选题:二分查找要求数组满足什么条件?

(1 分)
第 10 题 B3 未作答

单选题:在升序数组 a 中二分查找 x,当前区间为 [l, r],中点 mid。若 a[mid] < x,下一步应该在哪个区间找?

(1 分)
第 11 题 B4 未作答

单选题:在 10001000 个元素的有序数组中二分查找,最坏情况下最多比较约多少次?

(1 分)
第 12 题 B5 未作答

判断题:数据量大且有序时,二分查找 O(log2n)O(\log_2 n) 远快于顺序查找 O(n)O(n);例如 n=106n = 10^6 时,二分最多约 2020 次比较,顺序平均约 5×1055 \times 10^5 次。

(1 分)
第 13 题 B6 未作答

判断题:二分的本质不是"对着数组切半",而是对具有单调性的判断条件不断收缩可行区间——二分答案正是利用这一点,对答案的取值范围二分。

(1 分)
第 14 题 B7 未作答

判断题:链表也能高效地二分查找,因为每次只要从当前节点向后走一半的距离。

(1 分)

二分查找的边界细节

7 QUESTIONS · 2 POINTS EACH
第 15 题 C1 未作答

单选题:设 lr 是闭区间 [l, r] 的端点,且它们的值可能接近 23112^{31} - 1。计算中点 mid 的推荐写法是?

(1 分)
第 16 题 C2 未作答

判断题:闭区间写法 while (l <= r) 中,l == r 时区间里还剩 11 个元素必须检查,所以循环条件要带等号;写 while (l < r) 会漏掉最后一个元素。

(1 分)
第 17 题 C3 未作答

单选题:升序数组 a 中二分查找 x,若 a[mid] > x,说明 x 只可能在哪个区间?

(1 分)
第 18 题 C4 未作答

判断题:数组中有重复元素时,普通二分找到的"等于 x"的位置不一定是第一个;要找第一个等于 x 的位置,需要特殊处理——等于时也继续向左收缩。

(1 分)
第 19 题 C5 未作答

单选题:升序数组 a = {1, 2, 2, 2, 3, 3, 5},最后一个等于 2 的元素下标是(下标从 00 开始)?

(1 分)
第 20 题 C6 未作答

单选题:升序数组 a = {1, 3, 3, 5, 7, 9},其中第一个大于等于 44 的元素是?

(1 分)
第 21 题 C7 未作答

单选题:升序数组 a = {1, 3, 3, 5, 7, 9},其中第一个大于 33 的元素是?

(1 分)

二分答案基本概念

7 QUESTIONS · 2 POINTS EACH
第 22 题 D1 未作答

判断题:二分答案 = 答案的取值范围已知、且"可行性"随答案单调变化时,对答案的值二分:每次用 check(mid) 判断"答案取 mid 是否可行",据此收缩答案范围。

(1 分)
第 23 题 D2 未作答

判断题:二分答案的前提是可行性单调——例如答案越小越容易可行(可行与不可行各连成一段);没有这个性质就不能二分答案。

(1 分)
第 24 题 D3 未作答

单选题:二分答案求最大可行答案的常见框架是?

(1 分)
第 25 题 D4 未作答

单选题:以下哪类问题最适合用二分答案解决?

(1 分)
第 26 题 D5 未作答

判断题:二分答案中 check(mid) 的作用是判断"答案取 mid 时能否满足题目的限制条件";可行则 mid 保留在答案区间内继续试探,不可行则排除 mid 及更差的一半。

(1 分)
第 27 题 D6 未作答

判断题:二分答案的答案可能很大(如高达 10910^9 甚至 101810^{18}),lrmid 及相关求和计算应使用 long long,否则加法可能溢出。

(1 分)
第 28 题 D7 未作答

判断题:二分查找是对"数组下标区间"二分,二分答案是对"答案取值区间"二分——两者思想相同(利用单调性收缩区间),对象不同。

(1 分)

二分答案典型应用

6 QUESTIONS · 2 POINTS EACH
第 29 题 E1 未作答

单选题:砍树问题:有 NN 棵树,第 ii 棵高 hih_i。把每棵树从地面往上砍到统一高度 HH(比 HH 矮的树不砍),要求得到的木材总长度至少 MM,求最大的 HH。若 HH 减小,总木材长度会?

(1 分)
第 30 题 E2 未作答

单选题:跳石头问题:一条河上有若干石头(起点与终点固定),移走其中 MM 块后,要使相邻石头(含起点、终点)之间的最小距离尽可能大。这是哪类模型?

(1 分)
第 31 题 E3 未作答

单选题:分巧克力问题:NN 块巧克力边长分别为 hih_i,全部切成边长为 mid 的正方形(不能拼接),要求至少得到 KK 块。当 mid 变大时,能切出的总块数会?

(1 分)
第 32 题 E4 未作答

判断题:求 2\sqrt{2} 的近似值也可以用二分答案:在区间 [1,2][1, 2] 上二分,check(mid) 判断 mid * mid <= 2,不断缩小区间直到足够精确。

(1 分)
第 33 题 E5 未作答

单选题:浮点二分通常用什么作为终止条件?

(1 分)
第 34 题 E6 未作答

判断题:二分答案的 check(mid) 内部常用贪心验证可行性——例如验证"最短间距能否 mid\geq mid"时,间距不够就移走石头,最后看移走的数量是否 M\leq M

(1 分)

复杂度与适用性

6 QUESTIONS · 2 POINTS EACH
第 35 题 F1 未作答

单选题:二分查找是 O(log2n)O(\log_2 n) 而顺序查找是 O(n)O(n),根本原因是?

(1 分)
第 36 题 F2 未作答

单选题:在 10910^9 个元素的有序数组中二分查找,最坏比较次数约为?

(1 分)
第 37 题 F3 未作答

单选题:数据无序且只需要查找 11 次,最划算的做法是?

(1 分)
第 38 题 F4 未作答

单选题:数据无序但要反复查找很多次(查询次数很大),最划算的做法是?

(1 分)
第 39 题 F5 未作答

判断题:二分查找的局限:要求数据有序且支持随机访问;若数据经常插入、删除,维护有序状态的开销会很大。

(1 分)
第 40 题 F6 未作答

单选题:n=1000n = 1000 时,顺序查找平均比较约 500500 次、二分最坏约 1010 次;当 n=106n = 10^6 时,二分最坏比较次数约为?

(1 分)

二分相关技巧

5 QUESTIONS · 2 POINTS EACH
第 41 题 G1 未作答

单选题:C++ 标准库中 lower_bound(a, a + n, x) 返回的是?

(1 分)
第 42 题 G2 未作答

单选题:降序数组 a = {9, 7, 5, 3, 1} 中二分查找 4,若 a[mid] < 4,说明 4 应该在?

(1 分)
第 43 题 G3 未作答

判断题:手写二分查找找不到目标时,通常返回 -1 表示"不存在";若返回 0,会被误认为是"在下标 0 处找到"。

(1 分)
第 44 题 G4 未作答

判断题:求 x\lfloor \sqrt{x} \rfloorxx 为非负整数)可以用二分:在 [0,x][0, x] 中找最大的 mid 满足 mid * mid <= x

(1 分)
第 45 题 G5 未作答

判断题:二分查找可以写成递归(对半区间递归调用)或迭代(while 循环)两种形式,时间复杂度都是 O(log2n)O(\log_2 n)

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

单选题:二分代码 while (l < r) { mid = (l + r) / 2; if (check(mid)) l = mid; else r = mid - 1; } 求最大可行答案时,会出现什么问题?

(1 分)
第 47 题 H2 未作答

单选题:lr 都在 2×1092 \times 10^9 附近时,mid = (l + r) / 2 会发生什么?

(1 分)
第 48 题 H3 未作答

单选题:升序数组二分中,a[mid] > x 时误写成 l = mid(而不是 r = mid - 1),会导致?

(1 分)
第 49 题 H4 未作答

判断题:数组未排序时直接二分查找,结果不可信——可能碰巧返回正确位置,也可能返回错误位置。

(1 分)
第 50 题 H5 未作答

单选题:二分答案求最大可行答案时,check(mid) 为真却写成 r = mid - 1(把可行的 mid 排除了),会导致?

(1 分)

顺序查找代码

6 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {3, 7, 1, 9, 5, 2};  // 6 个元素
05    int x = 9;
06    for (int i = 0; i < 6; i++)
07        if (a[i] == x) { cout << i; break; }  // 找到就输出下标并停止
08    return 0;
09}

单选题:程序输出是?

(1 分)
第 52 题 I2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {3, 7, 1, 9, 5};
05    int x = 4;          // 数组里没有 4
06    int pos = -1;       // 先假设找不到
07    for (int i = 0; i < 5; i++)
08        if (a[i] == x) pos = i;
09    cout << pos;
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 53 题 I3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {2, 5, 2, 7, 2, 9, 2, 4};
05    int x = 2, cnt = 0;
06    for (int i = 0; i < 8; i++)
07        if (a[i] == x) cnt++;   // 每找到一个 x 就计数加 1
08    cout << cnt;
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 54 题 I4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {5, 2, 7, 2, 9, 2};
05    int x = 2;
06    for (int i = 0; i < 6; i++)
07        if (a[i] == x) { cout << i; return 0; }  // 从左往右找,输出第一个
08    return 0;
09}

单选题:程序输出是?

(1 分)
第 55 题 I5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {3, 8, 1, 8, 5, 2};
05    int p = 0;                  // p 记录当前最大值的下标
06    for (int i = 1; i < 6; i++)
07        if (a[i] > a[p]) p = i; // 严格大于才更新
08    cout << p;
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 56 题 I6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {0};                 // a[5] 留作哨兵
05    for (int i = 0; i < 5; i++) cin >> a[i];   // 输入:3 7 1 9 5
06    int x = 2, i = 0;
07    a[5] = x;                       // 哨兵:数组末尾放 x
08    while (a[i] != x) i++;          // 一定停:最坏停在哨兵处
09    if (i < 5) cout << i;
10    else cout << -1;
11    return 0;
12}

单选题:程序输出是?

(1 分)

二分查找基础代码

7 QUESTIONS · 2 POINTS EACH
第 57 题 J1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[9] = {1, 3, 5, 7, 9, 11, 13, 15, 17};  // 升序数组
05    int x = 13;
06    int l = 0, r = 8, ans = -1;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] == x) { ans = mid; break; }
10        else if (a[mid] < x) l = mid + 1;
11        else r = mid - 1;
12    }
13    cout << ans;
14    return 0;
15}

单选题:程序输出是?

(1 分)
第 58 题 J2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[9] = {1, 3, 5, 7, 9, 11, 13, 15, 17};
05    int x = 9;
06    int l = 0, r = 8;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        cout << mid << " ";         // 输出每次检查的中点下标
10        if (a[mid] == x) break;
11        else if (a[mid] < x) l = mid + 1;
12        else r = mid - 1;
13    }
14    return 0;
15}

单选题:程序输出是?

(1 分)
第 59 题 J3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
05    int x = 17;         // 数组中不存在 17
06    int l = 0, r = 9, cnt = 0;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        cnt++;          // 每比较一次计数加 1
10        if (a[mid] == x) break;
11        else if (a[mid] < x) l = mid + 1;
12        else r = mid - 1;
13    }
14    cout << cnt;
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 60 题 J4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[7] = {21, 17, 13, 9, 5, 3, 1};  // 降序数组
05    int x = 5;
06    int l = 0, r = 6;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] == x) { cout << mid; return 0; }
10        else if (a[mid] < x) r = mid - 1;   // 降序:当前太小,往左找更大的
11        else l = mid + 1;
12    }
13    cout << -1;
14    return 0;
15}

单选题:程序输出是?

(1 分)
第 61 题 J5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[7] = {2, 5, 8, 11, 14, 17, 20};  // 升序数组
04int f(int l, int r, int x) {            // 在 [l, r] 中二分查找 x
05    if (l > r) return -1;
06    int mid = l + (r - l) / 2;
07    if (a[mid] == x) return mid;
08    if (a[mid] < x) return f(mid + 1, r, x);  // 递归查右半
09    return f(l, mid - 1, x);                  // 递归查左半
10}
11int main() {
12    cout << f(0, 6, 11);
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 62 题 J6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {1, 3, 3, 5, 5, 7, 9, 9};  // 升序数组
05    int x = 5;
06    int l = 0, r = 8;         // 左闭右开 [l, r),r 是"尾后"位置
07    while (l < r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] < x) l = mid + 1;   // 中点太小,答案在右侧
10        else r = mid;                  // a[mid] >= x,答案在 [l, mid]
11    }
12    cout << l;                // 第一个 >= x 的下标
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 63 题 J7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {1, 3, 3, 5, 5, 7, 9, 9};  // 升序数组
05    int x = 5;
06    int l = 0, r = 8;         // 左闭右开 [l, r)
07    while (l < r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] <= x) l = mid + 1;  // 中点 <= x,答案在右侧
10        else r = mid;                  // a[mid] > x,答案在 [l, mid]
11    }
12    cout << l;                // 第一个 > x 的下标
13    return 0;
14}

单选题:程序输出是?

(1 分)
拾壹

二分边界变体代码

7 QUESTIONS · 2 POINTS EACH
第 64 题 K1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int l = 1500000000, r = 1600000000;  // 都接近 int 上限
05    int mid = (l + r) / 2;               // 注意:l + r 会先溢出
06    cout << mid;
07    return 0;
08}

单选题:在常见 32 位 int(补码截断)环境下,程序输出是?

(1 分)
第 65 题 K2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[9] = {1, 3, 5, 7, 9, 11, 13, 15, 17};  // 升序数组
05    // 找第一个 >= 10 的元素下标(lower_bound 写法)
06    int l = 0, r = 9;
07    while (l < r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] < 10) l = mid + 1;
10        else r = mid;
11    }
12    cout << l;
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 66 题 K3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[9] = {1, 3, 5, 7, 9, 11, 13, 15, 17};  // 升序数组
05    // 找最后一个 <= 10 的元素下标
06    int l = 0, r = 8;
07    while (l < r) {
08        int mid = (l + r + 1) / 2;      // 向上取整,防止死循环
09        if (a[mid] <= 10) l = mid;      // 可行则包含 mid 继续向右
10        else r = mid - 1;
11    }
12    cout << l;
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 67 题 K4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[10] = {2, 2, 3, 3, 3, 5, 5, 7, 7, 7};  // 升序,有重复
05    int x = 3;
06    int l = 0, r = 9, ans = -1;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] >= x) { ans = mid; r = mid - 1; }  // 记下并继续向左找
10        else l = mid + 1;
11    }
12    cout << ans;    // x 第一次出现的位置
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 68 题 K5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[10] = {2, 2, 3, 3, 3, 5, 5, 7, 7, 7};  // 升序,有重复
05    int x = 3;
06    int l = 0, r = 9, ans = -1;
07    while (l <= r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] <= x) { ans = mid; l = mid + 1; }  // 记下并继续向右找
10        else r = mid - 1;
11    }
12    cout << ans;    // x 最后一次出现的位置
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 69 题 K6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {1, 4, 4, 9, 12, 15};  // 升序数组
05    int x = 10;                       // 若插入 x,应该放在哪个下标?
06    int l = 0, r = 6;                 // 左闭右开,r 可等于 6
07    while (l < r) {
08        int mid = l + (r - l) / 2;
09        if (a[mid] < x) l = mid + 1;
10        else r = mid;
11    }
12    cout << l;        // 第一个 >= x 的位置即插入位置
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 70 题 K7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int x = 50;
05    // 求最大的整数 s 满足 s*s <= x(即 floor(sqrt(50)))
06    int l = 0, r = x;
07    while (l < r) {
08        int mid = (l + r + 1) / 2;
09        if (1LL * mid * mid <= x) l = mid;   // 1LL 防止乘法溢出
10        else r = mid - 1;
11    }
12    cout << l;
13    return 0;
14}

单选题:程序输出是?

(1 分)
拾贰

二分答案代码

7 QUESTIONS · 2 POINTS EACH
第 71 题 L1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[4] = {20, 15, 10, 17};   // 4 棵树的高度
05    int M = 7;                     // 至少需要 7 米木材
06    auto wood = [&](int H) {       // 都砍到高度 H,能得到多少木材
07        long long s = 0;
08        for (int i = 0; i < 4; i++)
09            if (h[i] > H) s += h[i] - H;
10        return s;
11    };
12    int l = 0, r = 1000000000;     // 答案范围 [0, 10^9]
13    while (l < r) {
14        int mid = (l + r + 1) / 2;
15        if (wood(mid) >= M) l = mid;   // 砍到 mid 够用,试着砍更高
16        else r = mid - 1;
17    }
18    cout << l;     // 最大的可行高度
19    return 0;
20}

单选题:程序输出是?

(1 分)
第 72 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int d[5] = {2, 11, 14, 17, 21};  // 石头到起点的距离(起点 0)
05    int L = 25, M = 2;               // 终点距离 25,最多移走 2 块石头
06    auto cnt = [&](int mid) {        // 使相邻间距 >= mid,需移走几块
07        int last = 0, c = 0;
08        for (int i = 0; i < 5; i++)
09            if (d[i] - last < mid) c++;     // 间距不够,移走这块
10            else last = d[i];
11        if (L - last < mid) c++;            // 最后一段到终点也不够
12        return c;
13    };
14    int l = 1, r = L;
15    while (l < r) {
16        int mid = (l + r + 1) / 2;
17        if (cnt(mid) <= M) l = mid;   // 移走数量在限额内,间距可更大
18        else r = mid - 1;
19    }
20    cout << l;     // 最大的最小间距
21    return 0;
22}

单选题:程序输出是?

(1 分)
第 73 题 L3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[3] = {6, 7, 8};   // 3 块巧克力的边长
05    int K = 10;             // 至少切出 10 块
06    auto cnt = [&](int mid) {        // 边长 mid 时能切几块
07        int s = 0;
08        for (int i = 0; i < 3; i++)
09            s += (h[i] / mid) * (h[i] / mid);
10        return s;
11    };
12    int l = 1, r = 100000;
13    while (l < r) {
14        int mid = (l + r + 1) / 2;
15        if (cnt(mid) >= K) l = mid;
16        else r = mid - 1;
17    }
18    cout << l;     // 最大的可行边长
19    return 0;
20}

单选题:程序输出是?

(1 分)
第 74 题 L4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    // f(x) = 2x + 3 单调不减,求最大的 x 使 f(x) <= 25
05    long long l = 0, r = 1000000;
06    while (l < r) {
07        long long mid = (l + r + 1) / 2;
08        if (2 * mid + 3 <= 25) l = mid;
09        else r = mid - 1;
10    }
11    cout << l;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 75 题 L5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[3] = {10, 8, 6};   // 3 棵树的高度
05    int M = 6;               // 至少需要 6 米木材
06    auto wood = [&](int H) {
07        int s = 0;
08        for (int i = 0; i < 3; i++)
09            if (h[i] > H) s += h[i] - H;
10        return s;
11    };
12    int l = 0, r = 1000000, ans = 0;
13    while (l <= r) {
14        int mid = (l + r) / 2;
15        if (wood(mid) >= M) { ans = mid; l = mid + 1; }  // 可行:记下并试更大
16        else r = mid - 1;
17    }
18    cout << ans;   // ans 记录法:循环结束后输出记录的最大可行值
19    return 0;
20}

单选题:程序输出是?

(1 分)
第 76 题 L6 未作答

判断题:二分答案中 r 必须设成"答案可能取到的最大值"(check(r) 不一定为真也没关系);若 r 设得比真实答案还小,就会漏掉可行答案。

(1 分)
第 77 题 L7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {4, 8, 15, 16, 23, 42};
04bool check(int mid) {           // 数组中 >= mid 的元素是否至少 3 个
05    int cnt = 0;
06    for (int i = 0; i < 6; i++)
07        if (a[i] >= mid) cnt++;
08    return cnt >= 3;
09}
10int main() {
11    cout << check(15);
12    return 0;
13}

单选题:程序输出是?

(1 分)
拾叁

浮点二分代码

6 QUESTIONS · 2 POINTS EACH
第 78 题 M1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double x = 2.0;             // 求 sqrt(2)
05    double l = 0, r = x;
06    for (int i = 1; i <= 60; i++) {
07        double mid = (l + r) / 2;
08        if (mid * mid <= x) l = mid;
09        else r = mid;
10    }
11    cout << fixed << setprecision(4) << l;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 79 题 M2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double l = 1.0, r = 2.0;    // sqrt(2) 在 [1, 2] 内
05    const double eps = 1e-4;    // 精度:区间长不超过 1e-4 就停
06    while (r - l > eps) {
07        double mid = (l + r) / 2;
08        if (mid * mid <= 2) l = mid;
09        else r = mid;
10    }
11    cout << fixed << setprecision(3) << (l + r) / 2;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 80 题 M3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double l = 0, r = 3;        // sqrt(2) 在 [0, 3] 内
05    for (int i = 1; i <= 50; i++) {   // 迭代 50 次,精度足够
06        double mid = (l + r) / 2;
07        if (mid * mid <= 2) l = mid;
08        else r = mid;
09    }
10    cout << fixed << setprecision(6) << l;
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 81 题 M4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    // 求 x^3 + x - 2 = 0 在 [0, 2] 内的根(该函数单调递增)
05    double l = 0, r = 2;
06    for (int i = 1; i <= 60; i++) {
07        double mid = (l + r) / 2;
08        if (mid * mid * mid + mid - 2 <= 0) l = mid;
09        else r = mid;
10    }
11    cout << fixed << setprecision(4) << l;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 82 题 M5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double x = 2.25;            // 求 sqrt(2.25)
05    double l = 0, r = 2;
06    for (int i = 1; i <= 40; i++) {
07        double mid = (l + r) / 2;
08        if (mid * mid <= x) l = mid;
09        else r = mid;
10    }
11    cout << fixed << setprecision(2) << l;
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 83 题 M6 未作答

单选题:用浮点二分求 xxx0x \geq 0)的平方根 x\sqrt{x} 时,初始区间通常设为?

(1 分)
拾肆

完善程序

7 QUESTIONS · 2 POINTS EACH
第 84 题 N1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {5, 2, 9, 7, 3, 8, 1, 6};
05    int x = 7;
06    int i = 0;
07    while (i < 8 && a[i] != x) ______;
08    cout << i;      // 找到则输出下标,找不到输出 8
09    return 0;
10}

单选题:横线处应填入?

(1 分)
第 85 题 N2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[7] = {1, 2, 4, 8, 16, 32, 64};  // 升序数组
05    int x = 32;
06    int l = 0, r = 6, ans = -1;
07    while (______) {
08        int mid = (l + r) / 2;
09        if (a[mid] == x) { ans = mid; break; }
10        else if (a[mid] < x) l = mid + 1;
11        else r = mid - 1;
12    }
13    cout << ans;
14    return 0;
15}

单选题:横线处应填入?

(1 分)
第 86 题 N3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {2, 3, 5, 7, 11, 13, 17, 19};  // 升序数组
05    int x = 13;
06    int l = 0, r = 7;
07    while (l <= r) {
08        int mid = ______;
09        if (a[mid] == x) { cout << mid; return 0; }
10        else if (a[mid] < x) l = mid + 1;
11        else r = mid - 1;
12    }
13    return 0;
14}

单选题:横线处应填入?

(1 分)
第 87 题 N4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[9] = {1, 3, 5, 7, 9, 11, 13, 15, 17};  // 升序数组
05    int x = 5;
06    int l = 0, r = 8;
07    while (l <= r) {
08        int mid = (l + r) / 2;
09        if (a[mid] == x) { cout << mid; return 0; }
10        else if (a[mid] < x) l = ______;
11        else r = ______;
12    }
13    cout << -1;
14    return 0;
15}

单选题:两处横线依次应填入?

(1 分)
第 88 题 N5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[4] = {20, 15, 10, 17};   // 4 棵树的高度
05    int M = 7;                     // 至少需要 7 米木材
06    int l = 0, r = 1000000000;
07    while (l < r) {
08        int mid = (l + r + 1) / 2;
09        long long s = 0;
10        for (int i = 0; i < 4; i++)
11            if (h[i] > mid) s += h[i] - mid;
12        if (______) l = mid;       // 木材够 → 试着砍更高
13        else r = mid - 1;
14    }
15    cout << l;
16    return 0;
17}

单选题:横线处应填入?

(1 分)
第 89 题 N6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {10, 20, 30, 40, 50};
04bool check(int mid) {           // 数组中大于 mid 的元素是否至少 2 个
05    int cnt = 0;
06    for (int i = 0; i < 5; i++)
07        if (______) cnt++;
08    return cnt >= 2;
09}
10int main() {
11    cout << check(25);
12    return 0;
13}

单选题:横线处应填入?

(1 分)
第 90 题 N7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    double l = 0, r = 2;            // sqrt(2) 在 [0, 2] 内
05    const double eps = 1e-6;
06    while (______) {
07        double mid = (l + r) / 2;
08        if (mid * mid <= 2) l = mid;
09        else r = mid;
10    }
11    cout << fixed << setprecision(4) << (l + r) / 2;
12    return 0;
13}

单选题:横线处应填入?

(1 分)
拾伍

代码综合应用

5 QUESTIONS · 2 POINTS EACH
第 91 题 O1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {5, 1, 4, 2, 3, 6};
05    sort(a, a + 6);             // 排序后数组:1 2 3 4 5 6
06    int q[3] = {4, 7, 1};       // 依次查询 3 个数
07    for (int k = 0; k < 3; k++) {
08        int l = 0, r = 5, ans = -1;
09        while (l <= r) {
10            int mid = (l + r) / 2;
11            if (a[mid] == q[k]) { ans = mid; break; }
12            else if (a[mid] < q[k]) l = mid + 1;
13            else r = mid - 1;
14        }
15        cout << ans << " ";     // 查到输出下标,查不到输出 -1
16    }
17    return 0;
18}

单选题:程序输出是?

(1 分)
第 92 题 O2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {1, 3, 3, 5, 5, 7, 9, 9};  // 升序数组
05    int x = 5;
06    // L:第一个 >= x 的下标(lower_bound)
07    int L = 0, R = 8;
08    while (L < R) {
09        int mid = (L + R) / 2;
10        if (a[mid] < x) L = mid + 1;
11        else R = mid;
12    }
13    // L2:第一个 > x 的下标(upper_bound)
14    int L2 = 0, R2 = 8;
15    while (L2 < R2) {
16        int mid = (L2 + R2) / 2;
17        if (a[mid] <= x) L2 = mid + 1;
18        else R2 = mid;
19    }
20    cout << L2 - L;     // x 出现的次数 = 上界 - 下界
21    return 0;
22}

单选题:程序输出是?

(1 分)
第 93 题 O3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {2, 5, 8, 12, 18};  // 升序数组
05    int x = 10;
06    int l = 0, r = 4, ans = a[0];
07    while (l <= r) {
08        int mid = (l + r) / 2;
09        if (abs(a[mid] - x) < abs(ans - x)) ans = a[mid];        // 更近就更新
10        else if (abs(a[mid] - x) == abs(ans - x)) ans = min(ans, a[mid]);  // 并列取较小值
11        if (a[mid] < x) l = mid + 1;
12        else r = mid - 1;
13    }
14    cout << ans;    // 与 x 最接近的数
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 94 题 O4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int p[3] = {1, 4, 7}, L = 10;  // 已有 3 盏路灯在 1/4/7,路长 10(起点 0)
04int need(int mid) {            // 要求相邻灯间距 <= mid,还需补几盏灯
05    int cnt = 0, last = 0;     // last:上一盏灯的位置(起点 0 视为有灯)
06    for (int i = 0; i < 3; i++) {
07        while (p[i] - last > mid) { cnt++; last += mid; }  // 缺口处每隔 mid 补一盏
08        last = p[i];
09    }
10    while (L - last > mid) { cnt++; last += mid; }         // 终点段同理
11    return cnt;
12}
13int main() {
14    cout << need(2);
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 95 题 O5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[7] = {10, 20, 30, 40, 50, 60, 70};  // 升序数组
05    int x = 40;
06    int l = 0, r = 6;
07    while (l <= r) {
08        int mid = (l + r) / 2;
09        if (a[mid] == x) { cout << a[mid] - mid; return 0; }  // 输出的是值减下标
10        else if (a[mid] < x) l = mid + 1;
11        else r = mid - 1;
12    }
13    return 0;
14}

单选题:程序输出是?

(1 分)
拾陆

代码易错

5 QUESTIONS · 2 POINTS EACH
第 96 题 P1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {1, 3, 5, 7, 9};
05    int x = 3;
06    int l = 0, r = 4;
07    while (l < r) {
08        int mid = (l + r) / 2;
09        if (a[mid] <= x) l = mid;      // 错误:应该写 l = mid + 1
10        else r = mid - 1;
11    }
12    cout << l;
13    return 0;
14}

单选题:程序运行结果是?

(1 分)
第 97 题 P2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int l = 1500000000, r = 1600000000;  // 都接近 int 上限
05    int mid = (l + r) / 2;               // l + r 溢出后再除以 2
06    cout << mid;
07    return 0;
08}

单选题:在常见 32 位 int(补码截断)环境下,程序输出是?

(1 分)
第 98 题 P3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {2, 4, 6, 8, 10, 12};
05    int x = 13;                 // 数组中不存在 13
06    int l = 0, r = 6;           // 左闭右开 [0, 6) 的 r
07    while (l <= r) {            // 错误:左闭右开却用了 <=
08        int mid = (l + r) / 2;
09        if (a[mid] == x) { cout << mid; return 0; }
10        else if (a[mid] < x) l = mid + 1;
11        else r = mid - 1;
12    }
13    cout << -1;
14    return 0;
15}

单选题:程序最可能出现什么情况?

(1 分)
第 99 题 P4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {2, 4, 6, 8, 10};
05    int x = 7, l = 0, r = 4, mid;
06    while (l < r) {
07        mid = (l + r + 1) / 2;
08        if (a[mid] <= x) l = mid;      // 找最后一个 <= 7 的下标
09        else r = mid - 1;
10    }
11    cout << mid;    // 错误:输出了最后一次计算的 mid,而非答案 l
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 100 题 P5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[3] = {10, 8, 6};     // 3 棵树的高度
05    int M = 6;                 // 至少需要 6 米木材
06    long long wood(int H) {
07        long long s = 0;
08        for (int i = 0; i < 3; i++)
09            if (h[i] > H) s += h[i] - H;
10        return s;
11    }
12    int l = 0, r = 1000000000;
13    while (l < r) {
14        int mid = (l + r + 1) / 2;
15        if (wood(mid) <= M) l = mid;   // 错误:判定方向写反
16        else r = mid - 1;
17    }
18    cout << l;
19    return 0;
20}

单选题:程序输出是?

(1 分)