林老师 · 客观题题库 · 第 34 章 搜索进阶 · 知识细节练习

第 34 章 搜索进阶 · 知识细节练习

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

判 分 报 告

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

搜索进阶基础

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

DFS 与 BFS 的核心区别是?

(1 分)
第 2 题 A2 未作答

判断题:搜索 = 在状态空间(所有可能局面)中找目标状态——搜索题的规模 = 状态空间大小。

(1 分)
第 3 题 A3 未作答

判断题:搜索过程展开成搜索树——节点是状态、边是转移;剪枝 = 砍掉不必展开的子树。

(1 分)
第 4 题 A4 未作答

判断题:剪枝不改变答案,只减少展开的节点数——好剪枝能让指数级搜索变得可过。

(1 分)
第 5 题 A5 未作答

判断题:搜索与 DP 完全等价——所有搜索题都能改写成多项式 DP。

(1 分)
第 6 题 A6 未作答

搜索进阶总表是?

(1 分)

DFS 剪枝

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

可行性剪枝是?

(1 分)
第 8 题 B2 未作答

最优性剪枝是?

(1 分)
第 9 题 B3 未作答

判断题:顺序剪枝——优先尝试"看起来更有希望"的分支(如先放大的数、先走离目标近的方向),配合最优性剪枝更快收紧上界。

(1 分)
第 10 题 B4 未作答

判断题:对称性/冗余剪枝——本质相同的状态只搜一个(如 N 皇后第一行只放前一半列、旋转镜像去重)。

(1 分)
第 11 题 B5 未作答

判断题:估价剪枝思想——用下界估价:当前 + 剩余最优下界 \ge 已知解就剪(IDA* 的基础)。

(1 分)
第 12 题 B6 未作答

判断题:剪枝必须不改变答案——可行性/最优性/对称性剪枝都保持正确性,剪错才会丢解。

(1 分)
第 13 题 B7 未作答

判断题:剪枝总表——可行(不可达)、最优(不更优)、顺序(先优后劣)、对称(去重)、估价(下界)五类。

(1 分)

迭代加深

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

迭代加深(IDDFS)的核心思想是?

(1 分)
第 15 题 C2 未作答

IDDFS 的适用场景是?

(1 分)
第 16 题 C3 未作答

判断题:IDDFS 兼具二者优点——像 BFS 一样找最短解(按深度递增),像 DFS 一样省空间。

(1 分)
第 17 题 C4 未作答

判断题:IDDFS 每层从头搜有重复展开,但浅层重复代价小——总复杂度与 BFS 同阶(分叉大的树)。

(1 分)
第 18 题 C5 未作答

判断题:IDA* = 迭代加深 + 估价剪枝——每层用 f=g+hf=g+h 超过限深就剪,兼具 A* 的引导与 IDDFS 的省空间。

(1 分)
第 19 题 C6 未作答

判断题:经典例题(埃及分数、骑士精神)用迭代加深——因为解深度未知、状态巨大且不宜全存。

(1 分)
第 20 题 C7 未作答

判断题:IDDFS 因为每层深度浅,任何情况下都不需要判重。

(1 分)

双向搜索

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

双向 BFS 的核心思想是?

(1 分)
第 22 题 D2 未作答

判断题:双向 BFS 要求终点已知且转移可逆——迷宫、数码、变换类问题适用。

(1 分)
第 23 题 D3 未作答

判断题:双向 BFS 把 O(bd)O(b^d) 降到 O(bd/2)O(b^{d/2})——分叉 b、深度 d 时两方向各走一半相遇。

(1 分)
第 24 题 D4 未作答

折半搜索(MITM)的核心思想是?

(1 分)
第 25 题 D5 未作答

判断题:MITM 例题——子集和/大背包:n=40n=402402^{40} 不可枚举,拆两半各 2202^{20} 再合并即可。

(1 分)
第 26 题 D6 未作答

判断题:MITM 合并——一半排序后,另一半每个值用二分/双指针查匹配,O(2n/2log2n/2)O(2^{n/2} \log 2^{n/2})

(1 分)
第 27 题 D7 未作答

判断题:双向搜索必须判重——两方向都记已访问状态,否则相遇检测失效、状态爆炸。

(1 分)

A* 与启发式

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

A* 的核心思想是?

(1 分)
第 29 题 E2 未作答

判断题:估价函数 h 可以任意大于真实距离——A* 仍然保证找到最优解。

(1 分)
第 30 题 E3 未作答

判断题:IDA* 用限深代替优先队列——f=g+hf=g+h 超过当前限深就剪,逐步增大限深。

(1 分)
第 31 题 E4 未作答

判断题:启发式设计——曼哈顿距离(数码/网格)是常用的可采纳估价(不绕路不可能更短)。

(1 分)
第 32 题 E5 未作答

判断题:A* 是 Dijkstra 的推广——h0h \equiv 0 时 A* 退化为 Dijkstra。

(1 分)
第 33 题 E6 未作答

判断题:适用判断——能设计出"不太离谱且可采纳"的估价函数时用 A*/IDA*;估价越准扩展越少。

(1 分)

搜索应用

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

nn 个不同元素的排列数是?

(1 分)
第 35 题 F2 未作答

nnkk 的组合数是?

(1 分)
第 36 题 F3 未作答

判断题:迷宫变体——最短路用 BFS(双向更优)、可行路径用 DFS、方案数用 DFS/DP、带权用 Dijkstra。

(1 分)
第 37 题 F4 未作答

判断题:数独 = 回溯搜索——逐格填数,用行/列/宫三个约束剪枝,不合法立即回退。

(1 分)
第 38 题 F5 未作答

判断题:状态压缩搜索——棋盘类状态用二进制位表示(如每行皇后位置、访问集合),便于哈希与判重。

(1 分)
第 39 题 F6 未作答

判断题:记忆化搜索——递归 DP 加查表:算过的状态直接返回,避免指数级重复展开。

(1 分)

算法选择

6 QUESTIONS · 2 POINTS EACH
第 40 题 G1 未作答

搜索选型流程是?

(1 分)
第 41 题 G2 未作答

剪枝选型是?

(1 分)
第 42 题 G3 未作答

判断题:复杂度估计——分叉 bb、深度 dd:DFS O(bd)O(b^d)、BFS O(bd)O(b^d) 空间、IDDFS 时间同阶空间 O(d)O(d)、双向 O(bd/2)O(b^{d/2})

(1 分)
第 43 题 G4 未作答

搜索 vs 其他算法的选择是?

(1 分)
第 44 题 G5 未作答

判断题:时间管理——搜索题先写朴素暴力拿部分分,再逐步加剪枝;剪枝复杂度分析不清就实测跑极限数据。

(1 分)
第 45 题 G6 未作答

判断题:选择综合——"小数据枚举、中等剪枝/MITM、最短路双向 BFS、有估价 A*"是搜索题四板斧。

(1 分)

易错综合

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

判断题:剪枝条件写反(如可行性剪成"不满足才继续")会把合法解全剪掉——剪枝必须保持"只剪必错的分支"。

(1 分)
第 47 题 H2 未作答

判断题:h 不可采纳(高估真实代价)时 A* 可能返回非最优路径——可采纳性是 A* 正确性的前提。

(1 分)
第 48 题 H3 未作答

判断题:IDDFS 每轮之间不清空访问标记/状态,会导致后续轮次"走不进去"而漏解。

(1 分)
第 49 题 H4 未作答

判断题:双向搜索合并时漏判相遇(只查一端标记)或忘算两端距离,会得到错误步数甚至死循环。

(1 分)
第 50 题 H5 未作答

判断题:以下结论全部正确——"剪枝不改答案;IDDFS 逐层加深且省空间;双向 BFS 把 O(bd)O(b^d) 降到 O(bd/2)O(b^{d/2});A* 的 h 必须可采纳;MITM 拆两半合并"。

(1 分)

DFS 剪枝代码

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

01#include <bits/stdc++.h>
02using namespace std;
03int n = 4, cnt = 0;
04int col[5];                            // col[r] = 第 r 行皇后所在列
05void dfs(int r) {
06    if (r > n) { cnt++; return; }
07    for (int c = 1; c <= n; c++) {
08        bool ok = true;
09        for (int i = 1; i < r; i++)
10            if (col[i] == c || abs(col[i] - c) == r - i) ok = false;   // 同列/同对角线
11        if (ok) { col[r] = c; dfs(r + 1); }
12    }
13}
14int main() { dfs(1); cout << cnt; return 0; }

单选题:程序输出是?(4×4 棋盘 N 皇后解数)

(1 分)
第 52 题 I2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, cnt = 0, vis[4] = {0}, a[4];
04void dfs(int dep) {
05    if (dep > n) { cnt++; return; }
06    for (int i = 1; i <= n; i++)
07        if (!vis[i]) {
08            vis[i] = 1;
09            a[dep] = i;
10            dfs(dep + 1);
11            vis[i] = 0;
12        }
13}
14int main() { dfs(1); cout << cnt; return 0; }

单选题:程序输出是?(1~3 的全排列数)

(1 分)
第 53 题 I3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 5, k = 3, cnt = 0, a[6];
04void dfs(int dep, int st) {            // st = 上一个选的位置
05    if (dep > k) { cnt++; return; }
06    for (int i = st + 1; i <= n; i++) {
07        a[dep] = i;
08        dfs(dep + 1, i);
09    }
10}
11int main() { dfs(1, 0); cout << cnt; return 0; }

单选题:程序输出是?(5 选 3 的组合数)

(1 分)
第 54 题 I4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, cnt = 0;
04void dfs(int x, int y) {               // 3x3 网格,只能向右/向下
05    if (x == n && y == n) { cnt++; return; }
06    if (x < n) dfs(x + 1, y);
07    if (y < n) dfs(x, y + 1);
08}
09int main() { dfs(1, 1); cout << cnt; return 0; }

单选题:程序输出是?((1,1) 到 (3,3) 的路径数)

(1 分)
第 55 题 I5 未作答

01void dfs(int dep, int cnt) {           // 已走 cnt 步,找最小步数
02    if (______) return;                // 最优性剪枝:不比当前最优更优
03    if (到达目标) { ans = cnt; return; }
04    ...
05}

单选题:横线处应填入?

(1 分)
第 56 题 I6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {0, 2, 3, 5, 7}, n = 4, target = 10, cnt = 0;
04void dfs(int i, int sum) {
05    if (sum > target) return;          // 可行性剪枝
06    if (i > n) { if (sum == target) cnt++; return; }
07    dfs(i + 1, sum + a[i]);
08    dfs(i + 1, sum);
09}
10int main() { dfs(1, 0); cout << cnt; return 0; }

单选题:程序输出是?(子集和为 10 的方案数)

(1 分)

迭代加深代码

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

// 二叉树:1 的孩子 2、3;2 的孩子 4、5;3 的孩子 6、7。目标 = 7(深度 2)
// IDDFS:maxdep 从 0 起逐层加深,找到目标就输出 maxdep
// maxdep=0 访问 1(无);maxdep=1 访问 1 2 3(无);maxdep=2 找到 7

单选题:程序输出是?

(1 分)
第 58 题 J2 未作答

// 二叉树同 J1,IDDFS 输出每一轮访问的节点序列:
// maxdep=0: 1
// maxdep=1: 1 2 3
// maxdep=2: 1 2 4 5 3 6 7

单选题:程序输出是?

(1 分)
第 59 题 J3 未作答

01// IDA*:限深 maxf 从 0 起逐步增大,每次输出当前限深:
02for (int maxf = 0; ; maxf++) {
03    cout << maxf << " ";
04    if (ida_star(0, maxf)) break;
05}
06// 假设第 3 次迭代(maxf = 2)找到解

单选题:程序输出是?

(1 分)
第 60 题 J4 未作答

01bool dfs(int u, int dep, int maxdep) {
02    if (u == target) return true;
03    if (______) return false;          // 到达限深仍未找到
04    for (int v : g[u])
05        if (dfs(v, dep + 1, maxdep)) return true;
06    return false;
07}

单选题:横线处应填入?

(1 分)
第 61 题 J5 未作答

// 链 1-2-3-4,目标 = 4(深度 3),IDDFS 逐层加深直到找到

单选题:程序输出是?(找到目标时的 maxdep)

(1 分)
第 62 题 J6 未作答

// 二叉树同 J1,IDDFS 统计:maxdep=0/1/2 三轮各访问 1 / 3 / 7 个节点,
// 最后输出找到目标时的 maxdep 与三轮总访问次数

单选题:程序输出是?

(1 分)
拾壹

双向搜索代码

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

// {2,3,5,7} 拆两半:{2,3} 与 {5,7},求子集和为 10 的方案数
// 半 A = {2,3} 子集和:{0,2,3,5};半 B = {5,7} 子集和:{0,5,7,12}
// 合并:5+5=10、3+7=10 → 2 种

单选题:程序输出是?

(1 分)
第 64 题 K2 未作答

// 半 A = {2,3},枚举其全部子集和并排序输出

单选题:程序输出是?

(1 分)
第 65 题 K3 未作答

// 3x3 网格,(1,1) 到 (3,3) 双向 BFS:
// 正向 2 层 {(1,1)}→{(1,2),(2,1)}→{(1,3),(2,2),(3,1)}
// 反向 2 层 {(3,3)}→{(2,3),(3,2)}→{(1,3),(2,2),(3,1)}
// 在 (2,2) 相遇:总步数 = 2 + 2 = 4

单选题:程序输出是?

(1 分)
第 66 题 K4 未作答

// 双向 BFS 同 K3,输出相遇时正反两方向已扩展的层数

单选题:程序输出是?

(1 分)
第 67 题 K5 未作答

01// 双向 BFS 扩展状态 u(正向)时:
02if (______) {                        // 反向已访问过 u → 相遇
03    return dist1[u] + dist2[u];
04}

单选题:横线处应填入?

(1 分)
第 68 题 K6 未作答

// {2,3,5} 的子集和 ≤ 7 的子集数:0、2、3、5、2+3、2+5 → 共 6 个(7 以内的和)

单选题:程序输出是?

(1 分)
第 69 题 K7 未作答

// MITM 综合:半 A = {2,3} 排序后 {0,2,3,5},半 B = {5,7},求子集和为 10 的方案数
// 输出半 A 排序结果与方案数

单选题:程序输出是?

(1 分)
拾贰

A*/IDA* 代码

6 QUESTIONS · 2 POINTS EACH
第 70 题 L1 未作答

// 5x5 空网格,(1,1) 到 (5,5),A* 用曼哈顿估价(可采纳)
// 最短路长度 = 4 + 4 = 8

单选题:程序输出是?

(1 分)
第 71 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int x1 = 1, y1 = 1, x2 = 5, y2 = 5;
05    cout << abs(x1 - x2) + abs(y1 - y2);   // 曼哈顿距离
06    return 0;
07}

单选题:程序输出是?

(1 分)
第 72 题 L3 未作答

// 4x4 网格,(1,1) 到 (4,4),障碍 (2,2)、(2,3)
// A* 最短路:右右右 + 下下下 = 6(绕过障碍不影响步数)

单选题:程序输出是?

(1 分)
第 73 题 L4 未作答

01struct Node { int g, h; };
02// 优先队列按 f 值排序:
03bool operator<(Node a, Node b) { return ______ > ______; }

单选题:横线处应填入?(f = g + h,小根堆)

(1 分)
第 74 题 L5 未作答

// 2x3 数码(宽 3 为奇数),可解 ⟺ 逆序数为偶数
// 局面 {1,2,3,4,5,0}:逆序数 0(偶)→ 可解

单选题:程序输出是?

(1 分)
第 75 题 L6 未作答

// 3x3 网格 A*,(1,1) 到 (3,3):目标处 g = 4、h = 0、f = 4

单选题:程序输出是?

(1 分)
拾叁

搜索应用代码

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

// 4x4 数独(2x2 宫):
// 1 . 3 .
// . 3 . 1
// 2 . 4 .
// . 4 . 2
// 回溯搜索唯一解后输出第 2 行第 1 列

单选题:程序输出是?

(1 分)
第 77 题 M2 未作答

// 1~3 全排列按字典序:123、132、213、231、312、321
// 输出第 3 个排列

单选题:程序输出是?

(1 分)
第 78 题 M3 未作答

// 5 选 3 组合按字典序:123、124、125、134、...
// 输出第 3 个组合

单选题:程序输出是?

(1 分)
第 79 题 M4 未作答

01for (int x = 1; x <= 4; x++) {
02    if (______) continue;              // 行/列/宫已有数字 x
03    row[r][x] = col[c][x] = blk[b][x] = 1;
04    a[r][c] = x;
05    dfs(next);
06    row[r][x] = col[c][x] = blk[b][x] = 0;
07}

单选题:横线处应填入?

(1 分)
第 80 题 M5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03long long memo[100];
04long long fib(int n) {
05    if (n <= 1) return n;
06    if (memo[n] != -1) return memo[n];      // 记忆化查表
07    return memo[n] = fib(n - 1) + fib(n - 2);
08}
09int main() {
10    memset(memo, -1, sizeof memo);
11    cout << fib(10);
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 81 题 M6 未作答

// 数独同 M1,输出第 2 行第 3 列(解为 2)

单选题:程序输出是?

(1 分)
拾肆

综合代码

6 QUESTIONS · 2 POINTS EACH
第 82 题 N1 未作答

// {1,2,3,4} 的子集和为 5 的方案数:{1,4}、{2,3} → 2

单选题:程序输出是?

(1 分)
第 83 题 N2 未作答

// 链 1-2-3-4,目标 4(深度 3),IDDFS 找到后输出 maxdep

单选题:程序输出是?

(1 分)
第 84 题 N3 未作答

// {2,3,5,7} 折半搜索求子集和为 10 的方案数

单选题:程序输出是?

(1 分)
第 85 题 N4 未作答

// 5x5 空网格 (1,1) 到 (5,5),A* 输出最短路长度

单选题:程序输出是?

(1 分)
第 86 题 N5 未作答

01int h(int x1, int y1, int x2, int y2) {
02    return ______;                    // 曼哈顿估价
03}

单选题:横线处应填入?

(1 分)
第 87 题 N6 未作答

// 3x3 网格 (1,1) 到 (3,3),双向 BFS 输出总步数

单选题:程序输出是?

(1 分)
拾伍

完善程序

7 QUESTIONS · 2 POINTS EACH
第 88 题 O1 未作答

01void dfs(int dep) {
02    if (dep > n) { 输出; return; }
03    for (int i = 1; i <= n; i++) {
04        if (①) continue;             // i 已用过
05        vis[i] = 1;
06        a[dep] = i;
07        dfs(dep + 1);
08        vis[i] = 0;
09    }
10}

单选题:①处应填?

(1 分)
第 89 题 O2 未作答

01void dfs(int dep, int cnt) {
02    if (①) return;                    // 最优性剪枝
03    if (到目标) { ans = cnt; return; }
04    ...
05}

单选题:①处应填?

(1 分)
第 90 题 O3 未作答

01bool dfs(int u, int dep, int maxdep) {
02    if (u == target) return true;
03    if (dep == maxdep) return false;
04    for (int v : g[u])
05        if (dfs(v, ①, maxdep)) return true;
06    return false;
07}

单选题:①处应填?

(1 分)
第 91 题 O4 未作答

01// 正向扩展出状态 u:
02if (①) return dist1[u] + dist2[u];    // 反向已访问 → 相遇

单选题:①处应填?

(1 分)
第 92 题 O5 未作答

01// 优先队列按 f = g + h 从小到大:
02priority_queue<Node, vector<Node>, greater<Node>> q;
03struct Node { int g, h; };
04bool operator>(Node a, Node b) { return ① > ②; }

单选题:①、②处应填?

(1 分)
第 93 题 O6 未作答

01for (int s2 : halfB) {
02    // 与 s2 配对成 target 的 halfA 值:
03    int need = ①;
04    cnt += upper_bound(halfA.begin(), halfA.end(), need)
05         - lower_bound(halfA.begin(), halfA.end(), need);
06}

单选题:①处应填?

(1 分)
第 94 题 O7 未作答

01long long f(int n) {
02    if (n <= 1) return n;
03    if (①) return memo[n];            // 已算过直接返回
04    return memo[n] = f(n - 1) + f(n - 2);
05}

单选题:①处应填?

(1 分)
拾陆

代码易错

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

01// 子集和 {2,3,5,7} 目标 10,但可行性剪枝写反了:
02void dfs(int i, int sum) {
03    if (sum < target) return;          // 注意:写成了"小于就剪"(应为大于才剪)
04    if (i > n) { if (sum == target) cnt++; return; }
05    dfs(i + 1, sum + a[i]);
06    dfs(i + 1, sum);
07}
08// 从 sum = 0 出发立刻被剪 → 一个解都找不到

单选题:程序输出是?(正确结果应为 2

(1 分)
第 96 题 P2 未作答

01// 4x4 迷宫,(1,1) 到 (2,4),障碍 (2,2)、(2,3);方向顺序 D,R,U,L
02// 最优性剪枝写反:if (cnt < ans) return;(应为 cnt >= ans 才剪)
03// ans 初值 INF → 第一个找到的解(8 步)就被当作答案
04// 正确最短路 = 4(右右右下)

单选题:程序输出是?(正确结果应为 4

(1 分)
第 97 题 P3 未作答

// 链 1-2-3-4,目标 4(深度 3),IDDFS 但 vis 数组在每轮之间没有清零:
// maxdep=0 访问 1 并标记;maxdep=1 想走 1→2 但 1 已标记……逐轮都被卡住
// 所有轮次都失败 → 输出 -1

单选题:程序输出是?(正确结果应为 3

(1 分)
第 98 题 P4 未作答

// {2,3,5,7} 拆 {2,3} 与 {5,7},求子集和为 10 的方案数
// halfA = {0,2,3,5} 但排序比较器写反,排成了降序 {5,3,2,0}
// lower_bound/upper_bound 要求升序——在降序数组上二分全部落空
// 输出 0

单选题:程序输出是?(正确结果应为 2

(1 分)
第 99 题 P5 未作答

// 3x3 网格,(1,1) 到 (3,3),障碍 (2,3);只用 h(曼哈顿)贪心、不回退:
// (1,1)→(1,2) h=3 →(1,3) h=2 →(2,3) 被挡、(1,2) 已访问 → 死路
// 贪心无路可走 → 输出 -1
// 正确最短路 = 4(下下右右)

单选题:程序输出是?(正确结果应为 4

(1 分)
第 100 题 P6 未作答

判断题:以下五种易错写法都会导致程序出错——①可行性剪枝写反(解全被剪)②最优性剪枝写反(首个解即答案、非最优)③IDDFS 每轮不清 vis(逐轮卡死漏解)④MITM 半数组排成降序就二分(查找落空)⑤只用 h 贪心不回退(陷入死路)。

(1 分)