GESP8 · 2025年9月真题

客观题逐题精讲

15 道单选 + 10 道判断。每题保留题干、选项、答案、考点、分步推导和易错提醒,适合投影讲评与课后复习。

一、考点地图

多重集合排列1 题
二项式定理1 题
分类计数1 题
古典概型1 题
广度优先搜索复杂度1 题
归并排序区间表示1 题
静态多态与运算符重载1 题
枚举与分类计数1 题
排序算法复杂度1 题
扇形周长公式1 题
生成树与有向图性质1 题
1 题

二、单选题逐题讲

单选题 1 枚举与分类计数

小杨想点一杯奶茶外卖,但还差5元起送。于是,小杨决定点一些小料。可选的小料包括:珍珠1元、椰果2元、奶冻3元、奶盖4元。每种小料最多点1份。请问共有多少种满足起送条件的点小料方案?()。

  1. A16
  2. B10
  3. C9
  4. D7
展开解析
答案:C
枚举与分类计数
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 4种小料每种选或不选,共有 2^4=16 种子集。
  2. 金额不足5元的只有:不选、1、2、3、4、1+2、1+3,共7种。
  3. 所以满足起送条件的方案数是 16-7=9,对应 C。
易错点:把“每种最多1份”看成“可重复选”,会把方案数算多。
单选题 2 组合计数

小杨和小刘是好朋友,她们在逛商场时发现新设置的大头贴自拍机,于是决定一起拍一组照片。一组照片包括4张,这4张照片没有顺序区分。拍每张照片时,可以选择有相框或无相框、两人可以分别选择有头饰或无头饰、还可以从2种位置(小杨在左,或小刘在左)中选出一种。她们不希望一组照片中出现完全相同的相框、头饰、位置的组合。请问一组照片共有多少种不同的方案?()。

  1. A1820
  2. B70
  3. C24
  4. D16
展开解析
答案:A
组合计数
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 单张照片的组合数为:相框 2 种,头饰对两人分别选择,共 2×2=4 种,站位 2 种,所以一共 2×4×2=16 种。
  2. 4张照片无顺序且不能重复,就是从16种里选4种,方案数为 C(16,4)=1820。
易错点:“4张没有顺序区分”说明应做组合,不是 16^4 或排列。
单选题 3 C++ 类与抽象类

下列关于C++类的说法,错误的是()。

  1. A派生类对象占用的内存总是不小于基类对象。
  2. B派生类可以不实现基类的虚函数。
  3. C如果一个类包含纯虚函数,则它不能包含成员变量。
  4. D如果一个类包含纯虚函数,则不能用它定义对象。
展开解析
答案:C
C++ 类与抽象类
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 含纯虚函数的类是抽象类,不能直接定义对象,但完全可以包含成员变量,所以 C 错。
  2. A 对,因为派生类对象至少包含一个基类子对象;
  3. B 对,派生类若不重写纯虚函数或相关虚函数,自己仍可继续作为抽象类存在;
  4. D 也对。
易错点:把“抽象类不能实例化”误认为“抽象类内部什么成员都不能有”。
单选题 4 树、生成树与有向图性质

下列关于树和图的说法,错误的是()。

  1. A每个连通图都存在生成树。
  2. B每个存在生成树的有向图,都一定是强连通的。
  3. C保留树的所有节点,并把树的每个节点指向其父节点,则可以将树转换为一个有向弱连通图。
  4. D保留树的所有节点,并把树的每个节点指向其子节点,则可以将树转换为一个有向无环图。
展开解析
答案:B
生成树与有向图性质
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. A 正确,连通无向图一定存在生成树。
  2. B 错在把“存在生成树”误当成“强连通”;
  3. 有向图只要存在从根到各点的生成树即可,并不要求任意两点互相可达。
  4. C 中各点连向父节点后忽略方向仍连通,所以是弱连通图;
  5. D 中边都从父到子,不会形成环,因此是有向无环图。
易错点:强连通要求远强于“存在一棵有向生成树”,两者不能混淆。
单选题 5 古典概型

一对夫妻生男生女的概率相同。这对夫妻希望儿女双全。请问这对夫妻生下三个孩子时,实现儿女双全的概率是多少?( )。

  1. A1 4 4 1 ​
  2. B1 2 2 1 ​
  3. C3 4 4 3 ​
  4. D7 8 8 7 ​
展开解析
答案:C
古典概型
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 3个孩子的性别共有 2^3=8 种等可能结果。
  2. 儿女双全表示既有男孩也有女孩,可用反面计数:全男或全女共2种。
  3. 所以概率为 1-2/8=6/8=3/4,对应 C。
易错点:不要把“儿女双全”误算成“恰好一男一女”;这里是3个孩子。
单选题 6 二项式定理

二项式 ( 𝑥 + 𝑦 ) 6 (x+y) 6 的展开式中 𝑥 2 𝑦 4 x 2 y 4 项的系数是()。

  1. A720
  2. B120
  3. C20
  4. D15
展开解析
答案:D
二项式定理
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 在 (x+y)^6 的展开式中,取 x^2y^4 说明要从6个因子里选2个提供 x,其余4个提供 y。
  2. 系数就是组合数 C(6,2)=15,所以选 D。
易错点:指数 2 和 4 只决定选取个数,不需要再乘 2!4!。
单选题 7 广度优先搜索复杂度

对一个包含 V 个顶点、E 条边的图,执行广度优先搜索,其最优时间复杂度是()。

  1. AO(V)
  2. BO(V + E)
  3. CO(V²)
  4. DO(E)
展开解析
答案:B
广度优先搜索复杂度
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. BFS 会把每个顶点至多入队、出队一次,因此顶点相关代价是 O(V)
  2. 同时每条边也只会被检查常数次,所以总复杂度是 O(V+E),选 B。
易错点:不能只看队列操作写成 O(V),边扫描同样是复杂度的重要部分。
单选题 8 贪心法与动态规划适用条件

以下关于贪心法和动态规划的说法中,错误的是()。

  1. A动态规划能解决大部分多阶段决策问题。
  2. B对特定的问题,贪心法不一定适用。
  3. C当特定的问题适用贪心法时,通常比动态规划的时间复杂度更低。
  4. D对很多问题,递推实现和递归实现动态规划方法的时间复杂度相当。
展开解析
答案:A
贪心法与动态规划适用条件
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. A 说“动态规划能解决大部分多阶段决策问题”表述过宽。
  2. 动态规划必须有最优子结构和重叠子问题,不满足这些条件时并不能直接套用。
  3. B 说明贪心并非总适用,正确;
  4. C 一般也对,适用贪心时常能比动态规划更省状态;
  5. D 中记忆化递归与递推版动态规划在很多题里时间复杂度相同。
易错点:动态规划很强,但不是“多阶段决策问题”的万能模板。
单选题 9 循环枚举与程序输出分析

下面程序的输出为()。

#include <iostream>
using namespace std;
int main() {
    int N = 15, cnt = 0;
    for (int x = 1; x + x + x <= N; x++)
        for (int y = x; x + y + y <= N; y++)
            for (int z = y; x + y + z <= N; z++)
                cnt++;
        cout << cnt << endl;
        return 0;
}
  1. A45
  2. B102
  3. C174
  4. D3375
展开解析
答案:B
循环枚举与程序输出分析
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 三重循环统计的是满足 1≤x≤y≤z 且 x+y+z≤15 的整数三元组个数。
  2. 按 x 分类:x=1 时有49组,x=2 时有30组,x=3 时有16组,x=4 时有6组,x=5 时有1组,总数 49+30+16+6+1=102
  3. 因此程序输出 102,选 B。
易错点:cout 和 return 不在三重循环内部,程序只会输出一次总计数。
单选题 10 线性筛时间复杂度

下面程序的时间复杂度为()。

int primes[MAXP], num = 0;
bool isPrime[MAXN] = {false};
void sieve() {
    for (int n = 2; n <= MAXN; n++) {
        if (!isPrime[n])
            primes[num++] = n;
        for (int i = 0; i < num && n * primes[i] <= MAXN; i++) {
            isPrime[n * primes[i]] = true;
            if (n % primes[i] == 0)
                break;
        }
    }
}
  1. A𝑂 ( 𝑛 log ⁡ 𝑛 ) O(nlogn)
  2. B𝑂 ( 𝑛 log ⁡ log ⁡ 𝑛 ) O(nloglogn)
  3. C𝑂 ( 𝑛 ) O(n)
  4. D𝑂 ( log ⁡ 𝑛 ) O(logn)
展开解析
答案:C
线性筛时间复杂度
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 这段代码是欧拉筛。
  2. 关键性质是每个合数只会被它的最小质因子筛掉一次,所以内层循环的总执行次数对所有 n 累加后仍是线性的。
  3. 因此整体时间复杂度是 O(n),对应 C。
易错点:不要把双层循环机械地看成 O(n^2);要看内层是否真的对每个 n 都完整跑一遍。
单选题 11 Dijkstra 实现复杂度分析

下列Dijkstra算法,假设图 graph 中顶点数 v、边数 e,则程序的时间复杂度为()。

typedef struct Edge {
    int in, out; // 从下标in顶点到下标out顶点的边
    int len;     // 边长度
    struct Edge* next;
} Edge;

// v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
void dijkstra(int v, Edge* graph[], int start, int* dis) {
    const int MAX_DIS = 0x7fffff;
    for (int i = 0; i < v; i++) {
        dis[i] = MAX_DIS;
    }
    dis[start] = 0;

    int* visited = new int[v];
    for (int i = 0; i < v; i++) {
        visited[i] = 0;
    }
    visited[start] = 1;

    for (int t = 0;; t++) {
        int min = MAX_DIS, minv = -1;
        for (int i = 0; i < v; i++) {
            if (visited[i] == 0 && min > dis[i]) {
                min = dis[i];
                minv = i;
            }
        }
        if (minv < 0) {
            break;
        }
        visited[minv] = 1;
        for (Edge* e = graph[minv]; e != NULL; e = e->next) {
            if (dis[e->out] > e->len) {
                dis[e->out] = e->len;
            }
        }
    }
    delete[] visited;
}
  1. AO(v^2)
  2. BO(vlogv+e)
  3. CO((v+e)logv)
  4. DO(v+e)
展开解析
答案:A
Dijkstra 实现复杂度分析
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 这份程序每轮都用一个长度为 v 的线性扫描找当前未访问点中距离最小的顶点,这一步要做 v 次,所以代价是 O(v^2)
  2. 遍历邻接表的总代价是 O(e),合起来是 O(v^2+e)
  3. 因为简单图中 e≤v^2,最终记为 O(v^2),选 A。
易错点:只有用堆优化时才常写成 O((v+e)logv);这段代码没有优先队列。
单选题 12 循环规模估计与欧几里得算法

下面 count_triple 函数的时间复杂度为()。

int gcd(int m, int n) {
    if (m == 0) return n;
    return gcd(n % m, m);
}

int count_triple(int n) {
    int cnt = 0;
    for (int v = 1; v * v * 4 <= n; v++)
        for (int u = v + 1; u * (u + v) * 2 <= n; u += 2)
        {
            if (gcd(u, v) == 1) {
                int a = u * u - v * v;
                int b = u * v * 2;
                int c = u * u + v * v;
                cnt += n / (a + b + c);
            }
            return cnt;
        }
    }
}
  1. A𝑂 ( 𝑛 2 ) O(n 2 )
  2. B𝑂 ( 𝑛 2 log ⁡ 𝑛 ) O(n 2 logn)
  3. C𝑂 ( 𝑛 ) O(n)
  4. D𝑂 ( 𝑛 log ⁡ 𝑛 ) O(nlogn)
展开解析
答案:D
循环规模估计与欧几里得算法
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 按题目意图分析,外层枚举 (u,v) 的总次数与 n 同阶;
  2. 其中每次最重的操作是 gcd(u,v),欧几里得算法复杂度为 O(log n)
  3. 因此总时间复杂度为 O(n log n),选 D。
易错点:这题不能只盯着两层循环个数,还要把 gcd 的对数复杂度一并乘进去。
单选题 13 归并排序区间表示

下面 merge_sort 函数试图实现归并排序算法,横线处应该填入的是()。

#include <vector>
using namespace std;
void merge_sort(vector<int> & arr, int left, int right) {
    if (right - left <= 1)
        return;
    int mid = (left + right) / 2;
    merge_sort(____); // 在此处填入选项
    merge_sort(____); // 在此处填入选项
    vector<int> temp(right - left);
    int i = left, j = mid, k = 0;
    while (i < mid && j < right)
        if (arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    while (i < mid)
        temp[k++] = arr[i++];
    while (j < right)
        temp[k++] = arr[j++];
    for (i = left, k = 0; i < right; ++i, ++k)
        arr[i] = temp[k];
}
  1. Aarr, left, mid arr, mid, right
  2. Barr, left, mid + 1 arr, mid + 1, right
  3. C1 arr, left, mid 2 arr, mid + 1, right
  4. Darr, left, mid + 1 arr, mid + 1, right + 1
展开解析
答案:A
归并排序区间表示
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 函数把排序区间写成左闭右开 [left, right)。
  2. 因为归并时左半段用 [left, mid),右半段用 [mid, right),递归调用也必须保持同样的边界。
  3. 所以两处应分别填 arr, left, mid 和 arr, mid, right,即 A。
易错点:把右端点当成闭区间会导致区间重叠或漏元素。
单选题 14 Prim 算法中的松弛条件

下面Prim算法程序中,横线处应该填入的是()。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int prim(vector<vector<int>> & graph, int n) {
    vector<int> key(n, INT_MAX);
    vector<int> parent(n, -1);
    key[0] = 0;
    for (int i = 0; i < n; i++) {
        int u = min_element(key.begin(), key.end()) - key.begin();
        if (key[u] == INT_MAX)
            break;
        for (int v = 0; v < n; v++) {
            if (_____) { // 在此处填入选项
                key[v] = graph[u][v];
                parent[v] = u;
            }
        }
        int sum = 0;
        for (int i = 0; i < n; i++) {
            if (parent[i] != -1) {
                cout << "Edge: " << parent[i] << " - " << i << " Weight: " << key[i] << endl;
                sum += key[i];
            }
        }
        return sum;
    }
    int main() {
        int n, m;
        cin >> n >> m;
        vector<vector<int>> graph(n, vector<int>(n, 0));
        for (int i = 0; i < m; i++) {
            int u, v, w;
            cin >> u >> v >> w;
            graph[u][v] = w;
            graph[v][u] = w;
        }
        int result = prim(graph, n);
        cout << "Total weight of the minimum spanning tree: " << result << endl;
        return 0;
    }
}
  1. Agraph[u][v] >= 0 && key[v] > graph[u][v]
  2. Bgraph[u][v] <= 0 && key[v] > graph[u][v]
  3. Cgraph[u][v] == 0 && key[v] > graph[u][v]
  4. Dgraph[u][v] != 0 && key[v] > graph[u][v]
展开解析
答案:D
Prim 算法中的松弛条件
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 邻接矩阵里 0 表示无边,因此候选边必须满足 graph[u][v] != 0。
  2. 同时只有当当前边权更小,即 key[v] > graph[u][v] 时,才需要更新最小连接代价。
  3. 因此应填 graph[u][v] != 0 && key[v] > graph[u][v],选 D。
易错点:若写成 >=0,会把权值为0的“无边”也当成可选边,逻辑就错了。
单选题 15 最短路径计算

下面的程序使用出边邻接表表达的带权无向图,则从顶点0到顶点3的最短距离为()。

#include <vector>
using namespace std;
class Edge {
public:
    int dest;
    int weight;
    Edge(int d, int w) : dest(d), weight(w) {}
};
class Graph {
    private:
        int num_vertex;
        vector<vector<Edge>> vve;
    public:
        Graph(int v) : num_vertex(v), vve(v) {}
        void addEdge(int s, int d, int w) {
            vve[s].emplace_back(d, w);
            vve[d].emplace_back(s, w)
        }
    };
    int main() {
        Graph g(4);
        g.addEdge(0, 1, 8);
        g.addEdge(0, 2, 5);
        g.addEdge(1, 2, 1);
        g.addEdge(1, 3, 3);
        g.addEdge(2, 3, 7);
        return 0;
    }
}
  1. A12
  2. B11
  3. C10
  4. D9
展开解析
答案:D
最短路径计算
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 图中从 0 到 3 的候选路径有:0→1→3 长度 8+3=11,0→2→3 长度 5+7=12,0→2→1→3 长度 5+1+3=9
  2. 最短的是 9,所以选 D。
易错点:看到直接相连的边后容易停止比较,但最短路常需要经过中间顶点。

三、判断题逐题讲

判断题 1 字符常量与按位异或

C++语言中,表达式 '9' ^ 3 的结果值为 '999'。

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
字符常量与按位异或
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 9 放在单引号里是字符常量,实际参与运算的是它的编码值 57。
  2. 表达式 57 ^ 3 做的是按位异或,结果是数值 58,不会得到 999。
易错点:单引号表示单个字符,不是字符串。
判断题 2 数组越界

下列C++语言代码,能够安全地输出 arr[5] 的值。 1 int n = 5; 2 int arr[n] = {1, 2, 3}; 3 std::cout << arr[5];

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
数组越界
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. arr 的有效下标只有 0 到 4,而 arr[5] 已经越界。
  2. 越界访问属于未定义行为,因此这段代码不能安全输出 arr[5] 的值。
易错点:数组长度是5时,最后一个合法下标是4,不是5。
判断题 3 排序算法复杂度

对n个元素的数组进行排序,最差情况的时间复杂度为 𝑂 ( 𝑛 2 ) O(n 2 )

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
排序算法复杂度
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 题目没有限定具体排序算法,不能笼统说“排序的最差复杂度就是 O(n^2)”。
  2. 例如归并排序、堆排序的最坏时间复杂度都是 O(n log n)
易错点:把冒泡、选择、插入这类 O(n^2) 排序当成了所有排序算法的统一结论。
判断题 4 多重集合排列

有4个红球、3个蓝球和2个绿球排成一排(相同色球视为完全相同),则不同的排列方案数为1260种。

  1. 正确正确
  2. 错误错误
展开解析
答案:正确
多重集合排列
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 9个球中有4个红球相同、3个蓝球相同、2个绿球相同,不同排列数为 9!/(4!3!2!)=1260。
  2. 所以题目说法正确。
易错点:有重复元素时不能直接算 9!,必须除以相同颜色内部的重复排列。
判断题 5 数学函数与整型溢出

使用 math.h 或 cmath 头文件中的函数,对于 int 类型的变量 x,表达式 fabs(x) 和 sqrt(x * x) 的结果总是近似相等的。

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
数学函数与整型溢出
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 在不溢出的情况下,fabs(x) 与 sqrt(x*x) 的数值确实相同;
  2. 但题目说“总是”相等就错了。
  3. 因为 x*x 先按 int 计算,x 较大时可能发生整型溢出,结果就不再可靠。
易错点:不要忽略表达式里先发生的整型乘法;问题往往出在 x*x 这一步。
判断题 6 静态多态与运算符重载

运算符重载是C++语言静态多态的一种典型体现,而使用C语言则无法实现运算符重载。

  1. 正确正确
  2. 错误错误
展开解析
答案:正确
静态多态与运算符重载
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 运算符重载发生在编译期,属于静态多态的典型形式。
  2. C 语言本身不支持用户自定义类型的运算符重载,因此题目说法正确。
易错点:静态多态不只有函数重载,运算符重载也属于这一类。
判断题 7 图的度数序列

存在一个简单无向图满足:顶点数为6,边数为8,6个顶点的度数分别为3、3、3、3、2、2。

  1. 正确正确
  2. 错误错误
展开解析
答案:正确
图的度数序列
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 度数和为 3+3+3+3+2+2=16,正好等于 2×8,与8条边相符。
  2. 再用 Havel-Hakimi 检查序列 3,3,3,3,2,2,可继续化简到全0,因此这样的简单无向图确实存在。
易错点:度数和满足偶数只是必要条件,不是充分条件;还要看度数序列是否可图化。
判断题 8 扇形周长公式

已知两个 double 类型的变量 r 和 theta 分别表示一个扇形的圆半径及圆心角(弧度),则扇形的周长可以通过表达式(2 + theta) * r 求得。

  1. 正确正确
  2. 错误错误
展开解析
答案:正确
扇形周长公式
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 扇形周长 = 两条半径 + 弧长 = 2r + rθ。
  2. 提取公因子 r 后就是 (2 + θ)r,所以题目表达式正确。
易错点:弧度制下弧长公式是 rθ;若把 θ 当角度数,这个式子就不能直接用。
判断题 9 Dijkstra 算法复杂度

Dijkstra算法的时间复杂度为 𝑂 ( 𝑉 2 ) O(V 2 ),其中 V 为图中顶点的数量。

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
Dijkstra 算法复杂度
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. Dijkstra 的时间复杂度取决于实现方式。
  2. 用邻接矩阵加顺序找最小值时常是 O(V^2),但用堆优化和邻接表时常写成 O((V+E)logV),所以不能一概断言为 O(V^2)
易错点:算法名相同,不代表不同数据结构实现的复杂度也完全相同。
判断题 10 分类计数

从32名学生中选出2人分别担任男生班长和女生班长(男生班长必须是男生,女生班长必须是女生),则共有 𝐶 ( 32 , 2 ) / 2 C(32,2)/2种不同的选法。

  1. 正确正确
  2. 错误错误
展开解析
答案:错误
分类计数
思考路径:先抓住题目的考点,再把题干条件转成可以计算、判断或套用性质的步骤;最后用选项反查是否有常见陷阱。

分步推导

  1. 男生班长和女生班长的选择应分别在男生、女生中各选1人,方案数应是“男生人数 × 女生人数”。
  2. C(32,2)/2 既没有利用性别限制,也把问题错误地当成从32人里任取两人。
易错点:带角色和类别限制的计数题,通常要先按类别拆开再相乘。
答案速查表

单选题

1C2A3C4B5C6D7B8A9B10C11A12D13A14D15D

判断题

1错误2错误3错误4正确5错误6正确7正确8正确9错误10错误