GESP 客观题评测系统

试卷解析 · 理解每一步

2025-03-Level-8

2025-03-Level-8

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

单选题

第 1 题(单选题,2 分)

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

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

正确答案B

解析详情
答案 B分类与乘法原理
思路与推导
  1. 先选哪两种电器,再选各自型号。六类组合分别为冰箱电视、冰箱洗衣机、冰箱微波炉、电视洗衣机、电视微波炉、洗衣机微波炉。

  2. 对应方案数为 4×6、4×3、4×5、6×3、6×5、3×5,相加为 24+12+20+18+30+15=11924+12+20+18+30+15=119,选 B。

第 2 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C座位方案枚举
思路与推导
  1. 把图中三行从上到下编号,每行从左到右为 1 到 6 列。空闲相邻座位对:第一行有 (1,2)、(5,6);第二行有 (1,2)、(2,3)、(5,6);第三行有 (1,2)、(2,3)。

  2. 上下两组至少有一对前后相邻,等价于它们所在行相邻且列区间有重合。第一、二行之间有 3 种搭配,第二、三行之间有 4 种。

  3. 因此购票方案共 3+4=73+4=7,选 C;这里只数买哪四个座位,不数四人如何分配座位。

图解 · 看懂这一步7 种合法购票方案

左右滑动表格,可查看完整内容。

方案上方相邻两座下方相邻两座
1第1行:1、2列第2行:1、2列
2第1行:1、2列第2行:2、3列
3第1行:5、6列第2行:5、6列
4第2行:1、2列第3行:1、2列
5第2行:1、2列第3行:2、3列
6第2行:2、3列第3行:1、2列
7第2行:2、3列第3行:2、3列

行从上到下、列从左到右编号;每行是一组四座方案,不区分人员落座顺序。

第 3 题(单选题,2 分)

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

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

正确答案B

解析详情
答案 B虚析构函数
思路与推导
  1. 析构函数可以是普通函数,并非必须声明为 virtual。只有需要通过基类指针安全地多态删除派生类对象等情形时,虚析构函数才特别关键,因此 B 错误。

  2. 构造函数不能为 virtual;构造函数和析构函数可以设为 private,用于限制外部创建或销毁对象。

第 4 题(单选题,2 分)

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

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

正确答案A

解析详情
答案 A树与有向无环图
思路与推导
  1. 有向无环图只要求没有有向环,不保证满足树的连通性或每个非根结点只有一个父结点。

  2. 例如边 1→2、1→3、2→3 构成有向无环图,但结点 3 有两个前驱,忽略方向还形成三角形,不是一棵树。

  3. 所以 A 把所有有向无环图都当成树,错误。

第 5 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D数位统计
思路与推导
  1. 按当前答案 603 来看,这题应按“数字 5 出现的总次数”理解。1 到 2025 中,个位出现 5 的次数是 203 次,十位是 200 次,百位是 200 次,千位没有出现。

  2. 所以总次数为 203+200+200=603,对应 D。

第 6 题(单选题,2 分)

已定义 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圆的弦长
思路与推导
  1. 连接圆心与弦的两个端点,得到两腰均为 r、顶角为 θ 的等腰三角形。

  2. 从圆心向弦作垂线,弦被平分,圆心角也分为 θ/2。在任一半个直角三角形中,半弦长为 rsin⁡(θ/2)r\sin(\theta/2)。

  3. 所以 s=2rsin⁡(θ/2)s=2r\sin(\theta/2),选 D;调用 sin 时 θ 应使用弧度。

第 7 题(单选题,2 分)

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

A.
⌊log⁡2N⌋\lfloor \log_2 N \rfloor
B.
⌈log⁡2N⌉\lceil \log_2 N \rceil
C.
⌊log⁡2N⌋+1\lfloor \log_2 N \rfloor + 1
D.
无法确定。

正确答案D

解析详情
答案 D平衡树高度
思路与推导
  1. 平衡二叉树要求各处子树高度差受到限制,却不要求各层都填满。相同结点数可以组成不同形状的平衡树。

  2. 例如按层数计高度,7 个结点可构成高度 3 的满二叉树,也可构成高度 4 的 AVL 平衡树。因此仅凭 N 无法唯一确定精确树高,选 D。

  3. 可确定的是高度数量级通常为 O(log⁡N)O(\log N)。

第 8 题(单选题,2 分)

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

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

正确答案B

解析详情
答案 B分治法适用条件
思路与推导
  1. 分治先拆分问题,再求子问题并合并结果。“子问题相互独立”是许多典型分治算法的便利特征,但不是所有分治过程都必须完全无关联或无重叠。

  2. 例如直接递归计算斐波那契数会产生重叠子问题,仍具有分解和合并过程,只是效率低,可再用记忆化改进。因此 B 的“必须”过强。

第 9 题(单选题,2 分)

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程序条件判断
思路与推导
  1. 已知 n2=n*n,再把 n2 的十进制拆成左半 nl 和右半 nr。题目中的“神奇数字”要求 n2 是由 nl、nr 拼接而成,且满足 n=(nl+nr)。

  2. 所以横线处只需要判断 nl + nr == n,选 A。B 把和错比成平方数,C 多做了一次平方,D 中 ^ 还是按位异或。

第 10 题(单选题,2 分)

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(Nlog⁡N)O(N \log N)
B.
O(N1/2)O(N^{1/2})
C.
O(N1/2log⁡N)O(N^{1/2} \log N)
D.
O(N1/2(log⁡N)2)O(N^{1/2}(\log N)^{2})

正确答案D

解析详情
答案 D时间复杂度分析
思路与推导
  1. 外层循环满足 n*n<N,因此 n 的取值规模约为 O(N^1/2)。内层按 s 的位数枚举切分点,长度为 O(log N)。

  2. 每次切分会做 substr 和 stoi,单次也需要 O(log N),因此总复杂度是 O(N^1/2·(log N)^2),选 D。

第 11 题(单选题,2 分)

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

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线性筛边界
思路与推导
  1. 数组 isPrime 的大小是 MAXN+1,合法下标包括 MAXN,因此乘积的范围条件应为 n*primes[i]<=MAXN。

  2. 当 n%primes[i]==0 时应停止:继续使用更大质数,会让某些合数被重复筛去;在这里中断保证每个合数由其最小质因子负责标记。

  3. 两个条件对应 C。

第 12 题(单选题,2 分)

下面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

解析详情
答案 AFloyd 松弛更新
思路与推导
  1. Floyd 的核心转移是:若经过中转点 k 更短,就用 map[i][k]+map[k][j] 更新 map[i][j]。

  2. 因此横线处应填 map[i][j] = map[i][k] + map[k][j],选 A。题中代码排版虽有噪声,但转移式是标准的。

第 13 题(单选题,2 分)

下面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(N2log⁡N)O(N^{2}\log N)

正确答案C

解析详情
答案 CFloyd 复杂度
思路与推导
  1. Floyd 算法的主体是三重循环 k、i、j,各自都遍历 1 到 N。

  2. 因此主导复杂度为 O(N^3),选 C;题中其余输出和排版噪声不改变这一结论。

第 14 题(单选题,2 分)

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

#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杨辉三角递推
思路与推导
  1. 一维数组滚动生成杨辉三角时,要从右往左更新,这样 a[j-1] 还保留着上一行的值。

  2. 因此递推应写成 a[j] += a[j - 1],对应 B。若从左往右或改错下标,会把本行新值重复利用。

第 15 题(单选题,2 分)

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

#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(nlog⁡n)O(n \log n)
C.
O(n2)O(n^{2})
D.
O(n3)O(n^{3})

正确答案C

解析详情
答案 C双重循环复杂度
思路与推导
  1. 第 i 行先做一次长度约为 i 的倒序更新,再输出 i+1 个数,所以这一行的工作量是 O(i)。

  2. 把 i=0 到 n-1 累加,总代价为 1+2+...+n=O(n^2),因此选 C。

判断题

第 1 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误字符与浮点运算
思路与推导
  1. 字符 '5' 参与计算时使用编码值,在 ASCII 下为 53。与 double 数值 3.0 运算时,53 转为 double,再相减得到 50.0。

  2. 结果类型是 double,但数值不是 2.0,所以判断错误。若要取得数字 5,应先做 '5'−'0'。

第 2 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确友元函数
思路与推导
  1. 私有成员通常只能由类自身成员等授权范围访问。类中声明一个普通函数为 friend 后,该函数便获得访问该类私有和受保护成员的权限。

  2. 因此可以通过友元声明,让类外函数调用该类私有方法,题目正确。

第 3 题(判断题,2 分)

插入排序一般是稳定的。

正确答案正确

解析详情
答案 正确插入排序稳定性
思路与推导
  1. 标准插入排序移动的是严格大于当前关键字的已有元素,遇到相等元素就停止移动,将新元素放在旧相等元素之后。

  2. 例如 2a 先出现、2b 后出现,排序后仍是 2a 在前,所以一般稳定。

第 4 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确插空法
思路与推导
  1. 先放好 5 个相同红球,形成首尾及内部共 6 个空隙。要让蓝球互不相邻,每个空隙最多放 1 个蓝球。

  2. 从 6 个空隙选 4 个放入相同蓝球,有 (64)=15\binom{6}{4}=15 种,因此正确。

第 5 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误pow 返回类型
思路与推导
  1. pow(2,5) 计算 25=322^5=32,数值部分正确。

  2. 但 cmath 的此类算术参数调用采用浮点计算,返回通常为 double,而不是因为实参都是整数就返回 int,所以整个判断错误。

第 6 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误动态多态实现
思路与推导
  1. C 语言没有 C++ 的 virtual 关键字和成员函数语法,但可在结构体中存储函数指针,并通过对象中的函数指针调用不同实现。

  2. 这可以模拟虚函数表及运行时分派,因此不能从“不是面向对象语言”推出“无法实现虚函数机制”。

第 7 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误平衡搜索树查找
思路与推导
  1. 按题目默认的平衡二叉搜索树语境,树高为 O(log⁡N)O(\log N),查找每层只沿一个孩子继续,故最坏比较次数也是对数级。

  2. 题目给出的 O(N) 不是所求的紧确复杂度,按考试口径判错误。若只是一棵无搜索次序的平衡二叉树,则另需遍历,不能混淆这两个前提。

第 8 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确二次函数顶点
思路与推导
  1. 配方得到 y=(x+a/2)2+b−a2/4y=(x+a/2)^2+b-a^2/4。平方项在 x=−a/2 时最小为 0,因此顶点横坐标就是 −a/2。

  2. 使用 2.0 可让除法按浮点数计算,a 为奇数时也保留半整数结果,所以题中表达式符合公式。

第 9 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确BFS 判无向环
思路与推导
  1. BFS 记录每个结点的父结点。扫描边 u—v 时,若 v 未访问则将其入队;若 v 已访问且不是 u 的父结点,就发现了一条非树边,说明存在环。

  2. 对每个未访问连通分量都执行这一检查,即可判断整个无向简单图是否有环。

第 10 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误不同职务排列
思路与推导
  1. 先选班长有 32 种,再选副班长 31 种、学习委员 30 种、组织委员 29 种。

  2. 总数为 32×31×30×29=P(32,4)32×31×30×29=P(32,4)。组合数 C(32,4) 只选出四个人,没有分配四个不同职务,因此错误。