GESP 客观题评测系统

2025-03-Level-8

2025-03-Level-8

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

国家“以旧换新”政策仍在继续,小杨家决定在家里旧的冰箱、电视、洗衣机、微波炉中选两种换新。其中,冰箱有4种型号可选,电视有6种型号可选,洗衣机有3种型号可选,微波炉有5种型号可选。请问小杨家共有多少种换新的方案?()。

A.
18
B.
119
C.
238
D.
360

正确答案B

解析详情

【答案】B

【考点】分类乘法计数

【解析】 从4类家电中任选2类,再把对应型号数相乘后求和:4×6+4×3+4×5+6×3+6×5+3×5。 计算得 24+12+20+18+30+15=119,所以选 B。

【易错点】 这是“选两类再配型号”,不是把 4+6+3+5 直接相加或相乘。

2 题(单选题

小杨和3位朋友约好一起去看电影“哪吒2”。打开购票软件,他们发现,已经没有同一排连续的四个座位了(图中每个方框代表一个座位,红色方框代表已经售出)。朋友们商量了一下,决定分为两组,每组两人在同一排的相邻两个座位,且两组之间至少有一对座位是前后相邻的。请问共有多少种购票方案?()。

Image
A.
495
B.
96
C.
7
D.
4

正确答案C

解析详情

【答案】C

【考点】图形计数

【解析】 本题方案数依赖座位图。按题意应先在每一排找出所有可选的相邻双座,再筛出两组之间至少有一对前后相邻的组合。 结合题目给出的座位图逐一统计后,共有 7 种符合条件的购票方案,对应 C。

【易错点】 只统计同排相邻双座还不够,还要继续检查两组之间是否满足“前后相邻”。

3 题(单选题

下面关于C++类构造和析构函数的说法,错误的是()。

A.
构造函数不能声明为虚函数。
B.
析构函数必须声明为虚函数。
C.
类的默认构造函数可以被声明为private。
D.
类的析构函数可以被声明为private。

正确答案B

解析详情

【答案】B

【考点】构造函数与析构函数

【解析】 构造函数不能是虚函数,A 对。类的默认构造函数、析构函数都可以声明为 private,C、D 也对。 析构函数并不是“必须”声明为虚函数,只有当类要作为多态基类并通过基类指针删除派生类对象时才需要虚析构,所以错误项是 B。

【易错点】 “常常需要虚析构”不等于“所有类都必须写成虚析构”。

4 题(单选题

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

A.
树是一种有向无环图,有向无环图都是一棵树。
B.
如果把树看做有向图,每个节点指向其子节点,则该图是弱连通图。
C.
N个顶点且连通的无向图,其最小生成树一定包含N-1个条边。
D.
N+1个顶点、N条边的有向图,一定不是强连通的。

正确答案A

解析详情

【答案】A

【考点】树、生成树与强连通

【解析】 树若按边从父指向子看成有向图,确实是有向无环图;但有向无环图未必只有一个根,也未必连通,所以不一定是一棵树。 B 正确,因为忽略方向后树仍连通;C 正确,连通无向图的最小生成树一定有 N-1 条边;D 也正确,因为强连通的有向图至少每个点入度、出度都不为0,N+1个点只有N条边不可能做到。

【易错点】 “树属于 DAG”不代表“所有 DAG 都是树”,后者条件更强。

5 题(单选题

从 1 到 2025 这 2025 个数中,包含数字 5 的个数()。

A.
600
B.
601
C.
602
D.
603

正确答案D

解析详情

【答案】D

【考点】数位统计

【解析】 按当前答案 603 来看,这题应按“数字 5 出现的总次数”理解。1 到 2025 中,个位出现 5 的次数是 203 次,十位是 200 次,百位是 200 次,千位没有出现。 所以总次数为 203+200+200=603,对应 D。

【易错点】 “数字 5 出现多少次”和“有多少个数包含 5”是两个不同问题,不能混算。

6 题(单选题

已定义 double 类型的变量 r 和 theta,分别表示图中圆半径和圆心角。下列表达式中可以求出弦长 s 的是()。

Image
A.
r×cos(θ)r \times \cos(\theta)
B.
r×cos(θ/2)×2r \times \cos(\theta / 2) \times 2
C.
r×sin(θ)r \times \sin(\theta)
D.
r×sin(θ/2)×2r \times \sin(\theta / 2) \times 2

正确答案D

解析详情

【答案】D

【考点】圆的弦长公式

【解析】 弦长可由半弦对应的直角三角形求出:半弦长为 r sin(theta/2),所以整条弦长 s=2r sin(theta/2)。 因此应选 D;本题角度关系需结合图形理解,但核心公式就是这个。

【易错点】 不要把弦长和弧长混淆,弧长才和 rθ 直接相关。

7 题(单选题

N个节点的平衡二叉树的高为()。

A.
log2N\lfloor \log_2 N \rfloor
B.
log2N\lceil \log_2 N \rceil
C.
log2N+1\lfloor \log_2 N \rfloor + 1
D.
无法确定。

正确答案D

解析详情

【答案】D

【考点】平衡二叉树高度

【解析】 只给出“平衡二叉树”与节点数 N,并不能唯一确定高度。不同形态的平衡二叉树在满足平衡条件时,高度可以不同。 因此 A、B、C 都不能作为统一答案,选 D。

【易错点】 平衡二叉树不是满二叉树,也不是完全二叉树,不能把高度写成唯一的固定公式。

8 题(单选题

下列关于算法的说法,错误的是()。

A.
如果有足够的时间和空间,枚举法能解决一切有限的问题。
B.
分治算法将原问题分为多个子问题进行求解,且分解出的子问题必须相互独立。
C.
如果能找到合理的贪心原则,贪心算法往往能够比其他方法更快求解。
D.
倍增法在搜索未知长度的有序数组时,通过动态倍增或减半步长,快速定位目标范围。

正确答案B

解析详情

【答案】B

【考点】算法思想适用条件

【解析】 分治法把原问题拆成若干子问题分别求解后再合并,但子问题不一定必须“相互独立”。像归并排序的两个子数组是独立的,而很多递归分解问题并不要求严格独立表述。 A、C、D 都是常见正确描述,所以错误项是 B。

【易错点】 不要把“便于分析时常独立”误记成分治法的绝对定义。

9 题(单选题

2025是个神奇的数字,因为它是由两个数20和25拼接而成,而且2025=(20+25)2(20+25)^2。小杨决定写个程序找找小于N的正整数中共有多少这样神奇的数字。下面程序横线处应填入的是()。

int cnt = 0;
for (int n = 1; n * n < N; n++) {
    int n2 = n * n;
    std::string s = std::to_string(n2);
    for (int i = 1; i < s.length(); i++)
        if (s[i] != '0') {
            std::string sl = s.substr(0, i);
            std::string sr = s.substr(i);
            int nl = std::stoi(sl);
            int nr = std::stoi(sr);
            if (____) // 在此处填入选项
                cnt++;
            }
        }
    }
    return cnt;
}
A.
nl + nr == n
B.
nl + nr == n2
C.
(nl + nr) * (nl + nr) == n
D.
(nl + nr) ^ 2 == n2

正确答案A

解析详情

【答案】A

【考点】程序条件判断

【解析】 已知 n2=n*n,再把 n2 的十进制拆成左半 nl 和右半 nr。题目中的“神奇数字”要求 n2 是由 nl、nr 拼接而成,且满足 n=(nl+nr)。 所以横线处只需要判断 nl + nr == n,选 A。B 把和错比成平方数,C 多做了一次平方,D 中 ^ 还是按位异或。

【易错点】 这里比较的是平方根 n,不是已经得到的平方数 n2。

10 题(单选题

2025 是个神奇的数字,因为它是由两个数 20 和 25 拼接而成,而且2025=(20+25)22025 = (20 + 25)^2。小杨决定写个程序找找小于 N 的正整数中共有多少这样神奇的数字。该函数的时间复杂度为()。

#include <string>

int count_miracle(int N) {
    int cnt = 0;
    for (int n = 1; n * n < N; n++) {
        int n2 = n * n;
        std::string s = std::to_string(n2);
        for (int i = 1; i < s.length(); i++) {
            if (s[i] != '0') {
                std::string sl = s.substr(0, i);
                std::string sr = s.substr(i);
                int nl = std::stoi(sl);
                int nr = std::stoi(sr);
                if (____) // 在此处填入选项
                    cnt++;
            }
        }
        return cnt;
    }
}
A.
O(NlogN)O(N \log N)
B.
O(N1/2)O(N^{1/2})
C.
O(N1/2logN)O(N^{1/2} \log N)
D.
O(N1/2(logN)2)O(N^{1/2}(\log N)^{2})

正确答案D

解析详情

【答案】D

【考点】时间复杂度分析

【解析】 外层循环满足 n*n<N,因此 n 的取值规模约为 O(N^1/2)。内层按 s 的位数枚举切分点,长度为 O(log N)。 每次切分会做 substr 和 stoi,单次也需要 O(log N),因此总复杂度是 O(N^1/2·(log N)^2),选 D。

【易错点】 不要把字符串切片和转整数看成 O(1),它们都与位数有关。

11 题(单选题

下面的欧氏筛法程序中,两个横线处应填入的分别是()。

int primes[MAXP], num = 0;
bool isPrime[MAXN + 1] = {false};
void sieve() {
    for (int n = 2; n <= MAXN; n++) {
        if (!isPrime[n])
            primes[num++] = n;
        for (int i = 0; i < num && _____; i++) { // 在此处填入选项
            isPrime[n * primes[i]] = true;
            if (____) // 在此处填入选项
                break;
        }
    }
}
A.
1 | n * primes[i] < MAXN 2 | n % primes[i] == 0
B.
1 | n * primes[i] < MAXN 2 | primes[i] > n
C.
1 | n * primes[i] <= MAXN 2 | n % primes[i] == 0
D.
1 | n * primes[i] <= MAXN 2 | primes[i] > n

正确答案C

解析详情

【答案】C

【考点】欧拉筛

【解析】 数组大小开到 MAXN+1,循环中要允许 n*primes[i] 取到 MAXN,所以第一处应写 <= MAXN。 欧拉筛的关键是遇到最小质因子后立即 break,因此第二处应是 n % primes[i] == 0,选 C。

【易错点】 写成 < MAXN 会漏掉等于上界的合数,写成 primes[i] > n 也不是欧拉筛的停条件。

12 题(单选题

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

#include <iostream>
using namespace std;

#define N 21
#define INF 99999999
int map[N][N];
int main() {
    int n, m, t1, t2, t3;
    cin >> n >> m;
}
for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        if (i == j)
            map[i][j] = 0;
        else 
            map[i][j] = INF;
    }
}
for (int i = 1; i <= m; i++) {
    cin >> t1 >> t2 >> t3;
    map[t1][t2] = t3;
}
for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (map[i][j] > map[i][k] + map[k][j])
                _______; // 在此处填入选项
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    cout.width(4);
                    cout << map[i][j];
                }
                cout << end1;
            }
        }
    }
}
A.
map[i][j] = map[i][k] + map[k][j]
B.
map[i][k] = map[i][j] - map[k][j]
C.
map[i][j] = map[i][k] - map[k][j]
D.
map[k][j] = map[i][j] - map[i][k]

正确答案A

解析详情

【答案】A

【考点】Floyd 松弛更新

【解析】 Floyd 的核心转移是:若经过中转点 k 更短,就用 map[i][k]+map[k][j] 更新 map[i][j]。 因此横线处应填 map[i][j] = map[i][k] + map[k][j],选 A。题中代码排版虽有噪声,但转移式是标准的。

【易错点】 Floyd 更新的是当前两点间最短路 map[i][j],不是去改 map[i][k] 或 map[k][j]。

13 题(单选题

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

#include <iostream>
using namespace std;

#define N 21
#define INF 99999999
int map[N][N];
int main() {
    int n, m, t1, t2, t3;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        10
if (i == j)
    map[i][j] = 0;
else
    map[i][j] = INF;
}

for (int i = 1; i <= m; i++) {
    cin >> t1 >> t2 >> t3;
    map[t1][t2] = t3;
}

for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (map[i][j] > map[i][k] + map[k][j])
                    ; // 在此处填入选项
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cout.width(4);
            cout << map[i][j];
    }
    cout << endl;
}
A.
O(N)O(N)
B.
O(N2)O(N^{2})
C.
O(N3)O(N^{3})
D.
O(N2logN)O(N^{2}\log N)

正确答案C

解析详情

【答案】C

【考点】Floyd 复杂度

【解析】 Floyd 算法的主体是三重循环 k、i、j,各自都遍历 1 到 N。 因此主导复杂度为 O(N^3),选 C;题中其余输出和排版噪声不改变这一结论。

【易错点】 分析复杂度时抓住真正主导的三重枚举,不要被零散的输出语句分散注意力。

14 题(单选题

下列程序实现了输出杨辉三角形,代码中横线部分应该填入的是()。

#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        a[i] = 1;
        for (int j = i - 1; j > 0; j--) {
            // 在此处填入选项
            for (int j = 0; j <= i; j++) {
                cout << a[j] << "";
                cout << endl;
            }
            return 0;
        }
    }
}
A.
a[j] += a[j + 1]
B.
a[j] += a[j - 1]
C.
a[j - 1] += a[j]
D.
a[j + 1] += a[j]

正确答案B

解析详情

【答案】B

【考点】杨辉三角递推

【解析】 一维数组滚动生成杨辉三角时,要从右往左更新,这样 a[j-1] 还保留着上一行的值。 因此递推应写成 a[j] += a[j - 1],对应 B。若从左往右或改错下标,会把本行新值重复利用。

【易错点】 这类滚动数组必须倒序更新,否则会污染还没用到的旧状态。

15 题(单选题

下列程序实现了输出杨辉三角形,其时间复杂度为()。

#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        a[i] = 1;
        for (int j = i - 1; j > 0; j--)
            ___ // 在此处填入选项
        for (int j = 0; j <= i; j++)
            cout << a[j] << " "
        cout << endl;
    }
    return 0;
}
A.
O(n)O(n)
B.
O(nlogn)O(n \log n)
C.
O(n2)O(n^{2})
D.
O(n3)O(n^{3})

正确答案C

解析详情

【答案】C

【考点】双重循环复杂度

【解析】 第 i 行先做一次长度约为 i 的倒序更新,再输出 i+1 个数,所以这一行的工作量是 O(i)。 把 i=0 到 n-1 累加,总代价为 1+2+...+n=O(n^2),因此选 C。

【易错点】 不是只看最内层一次循环,而要把每一行的工作量整体累加。

判断题(每题 2 分)

1 题(判断题

表达式 '5' - 3.0 的结果为 2.0,类型为 double。

正确答案错误

解析详情

【答案】错误

【考点】字符与浮点混合运算

【解析】 字符常量 5 放在单引号中表示字符,其编码值是 53。53-3.0 的结果是 50.0,类型会提升为 double,但数值不是 2.0。

【易错点】 字符 5 和整数 5 不是一回事,先看字符编码再做运算。

2 题(判断题

在C++语言中,如果想要在一个函数内调用一个类的私有方法,可以在该类中将该函数声明为友元函数。

正确答案正确

解析详情

【答案】正确

【考点】友元函数

【解析】 把某个函数声明为类的友元后,该函数就能访问这个类的 private 成员和私有方法。 所以题目说法正确。

【易错点】 友元不是成员函数,但它照样可以被授予访问私有成员的权限。

3 题(判断题

插入排序一般是稳定的。

正确答案正确

解析详情

【答案】正确

【考点】排序稳定性

【解析】 插入排序在比较时通常只把当前元素插到前面第一个比它大的元素之前,不会打乱相等元素原有的先后顺序。 因此它一般是稳定排序。

【易错点】 判断稳定性要看“相等元素的相对次序是否改变”,不是看交换次数多少。

4 题(判断题

5 个相同的红球和 4 个相同的蓝球排成一排,要求蓝球不能相邻,则一共有 15 种排列方案。

正确答案正确

解析详情

【答案】正确

【考点】插空法计数

【解析】 5 个红球先排好后形成 6 个空位。4 个相同蓝球不能相邻,因此只能从这 6 个空位中选 4 个放入,每个空位至多放 1 个。 方案数为 C(6,4)=15,所以题目说法正确。

【易错点】 蓝球相同且不能相邻,不能再乘 4!。

5 题(判断题

使用 math.h 或 cmath 头文件中的函数,表达式 pow(2, 5) 的结果类型为 int、值为 32。

正确答案错误

解析详情

【答案】错误

【考点】数学库函数返回类型

【解析】 pow(2,5) 的数值确实是 32,但标准库中的 pow 返回浮点类型,通常是 double,不是 int。 因此这个断言错误。

【易错点】 函数算出来像整数,不代表它的返回类型就是整型。

6 题(判断题

C++ 是一种面向对象编程语言,C 则不是。多态是面向对象三大特性之一,虚函数是动态多态的代表特性。因此,使用 C 语言无法实现虚函数。

正确答案错误

解析详情

【答案】错误

【考点】动态多态思想

【解析】 C 语言没有 C++ 那样内建的虚函数语法,但可以通过结构体加函数指针手工模拟动态分发。 所以“无法实现虚函数”说得过死,断言错误。

【易错点】 没有语言关键字支持,不等于完全不能实现类似机制。

7 题(判断题

在 N 个节点的平衡二叉树中查找指定元素的最差时间复杂度为O(N)O(N)

正确答案错误

解析详情

【答案】错误

【考点】平衡二叉树查找复杂度

【解析】 平衡二叉树的高度通常保持在 O(log N) 级别,查找沿一条根到叶的路径进行,最差复杂度也是 O(log N)。 因此写成 O(N) 是错误的。

【易错点】 查找树的复杂度由树高决定,不是由节点总数直接决定。

8 题(判断题

定义 int 类型的变量 a 和 b,求二次函数y=x2+ax+by = x^2 + ax + b取最小值时 x 的值,可以通过表达式a/2.0-a / 2.0求得。

正确答案正确

解析详情

【答案】正确

【考点】二次函数顶点

【解析】 对 y=x^2+ax+b,开口向上,顶点横坐标公式为 -a/(2×1)=-a/2。写成 -a/2.0 只是显式用浮点数计算。 因此该表达式可以求出取最小值时的 x。

【易错点】 顶点横坐标只和 x^2、x 的系数有关,与常数项 b 无关。

9 题(判断题

判断无向图中是否有环,可以通过广度优先搜索实现。

正确答案正确

解析详情

【答案】正确

【考点】图的环检测

【解析】 无向图做 BFS 时,可以记录每个点的父节点;若遇到一个已访问且不是当前点父节点的邻点,就说明存在环。 所以 BFS 可以用于判断无向图是否有环。

【易错点】 无向图遍历中遇到已访问点不一定成环,先排除回到父节点的情况。

10 题(判断题

从 32 名学生中选出 4 人分别担任班长、副班长、学习委员和组织委员,共有C(32,4)C(32,4)种不同的选法。

正确答案错误

解析详情

【答案】错误

【考点】排列与组合

【解析】 班长、副班长、学习委员、组织委员是 4 个不同职位,同样的 4 个人换岗位后算不同方案。 因此应使用排列数 P(32,4),不是组合数 C(32,4),所以题目说法错误。

【易错点】 只要职位有区分,就要考虑顺序,不能用组合。