202512 GESP认证 C++编程 五级真题试卷
剩余时间 --:--:--
单选题 共 15 题
1.

对如下定义的C++循环单链表,横线处填写( )。


2.

区块链技术是比特币的基础。在区块链中,每个区块指向前一个区块,构成链式列表,新区块只能接在链尾,不允许在中间插入或删除。下面C++代码实现插入区块添加函数,则横线处填写( )。

3.

下面关于单链表和双链表的描述中,正确的是( )。

4.
假设我们有两个数 a=38 和 b=14,它们对模 m 同余,即 a=b(mod m)。以下哪个值不可能是 m?
5.

下面C++代码实现了欧几里得算法。下面有关说法,错误的是( )。

6.
唯一分解定理描述的内容是( )。
7.

下述c++代码实现素数表的线性筛法,筛选出所有小于等于 的素数,则横线上应填的代码是( )。

8.
下列关于排序的说法,正确的是( )。
9.

下面c++代码实现了归并排序。下述关于归并排序的说法中,不正确的是( )。

10.

下述C++代码实现了快速排序算法,最坏情况的时间复杂度是( )。

11.

下面C++代码尝试在有序数组中查找第一个大于等于 x 的元素位置。如果没有大于等于 x 的元素,返回 arr.size() 。以下说法正确的是( )。

int lower_bound(vector<int>& arr, int x) {
    int l = 0, r = arr.size();
    while(l < r) {
        int mid = l + (r - l) / 2;
        if(arr[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return l;
}


12.

小杨要把一根长度为 L 的木头切成 K 段,使得每段长度小于等于 x 。已知每切一刀只能把一段木头分成 两段,他用二分法找到满足条件的最小 x ( x 为正整数),则横线处应填写( )。

13.

下面给出了阶乘计算的两种方式。以下说法正确的是( )。

14.

给定有 n 个任务,每个任务有截止时间和利润,每个任务耗时 1 个时间单位、必须在截止时间前完成,且每个时间槽最多做 1 个任务。为了在规定时间内获得最大利润,可以采用贪心策略,即按利润从高到低排序,尽量安 排,则横线处应填写( )。

15.

下面C++代码实现了对两个数组表示的正整数的高精度加法(数组低位在前),则横线上应填写( )。

判断题 共 10 题
1.
数组和链表都是线性表。链表的优点是插入删除不需要移动元素,并且能随机查找。
2.

假设函数 gcd() 函数能正确求两个正整数的最大公约数,则下面的 lcm(a,b) 函数能正确找到两个正整 数 a 和 b 的最小公倍数。

int lcm(int a, int b) {
    return a / gcd(a, b) * b;
}
3.
在单链表中,已知指针 p 指向要删除的结点(非尾结点),想在 删除 p ,可行做法是用 p->next 覆盖 p 的值与 next ,然后删除 p->next 。
4.
在求解所有不大于 n 的素数时,线性筛法(欧拉筛)都应当优先于埃氏筛法使用,因为线性筛法的时间复杂度为 O(n),低于埃氏筛法的 O(n log log n)
5.
二分查找仅适用于有序数据。若输入数据无序,当仅进行一次查找时,为了使用二分而排序通常不划算。
6.
通过在数组的第一个、最中间和最后一个这3个数据中选择中间值作为枢轴(比较基准),快速排序算法可 降低落入最坏情况的概率。
7.
贪心算法在每一步都做出当前看来最优的局部选择,并且一旦做出选择就不再回溯;而分治算法将问题分解 为若干子问题分别求解,再将子问题的解合并得到原问题的解。
8.

以下 fib 函数计算第 n 项斐波那契数( fib(0)=0 , fib(1)=1 ),其时间复杂度为 O(n)。

int fib(int n) {
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);
}
9.
递归函数一定要有终止条件,否则可能会造成栈溢出。
10.
使用贪心算法解决问题时,通过对每一步求局部最优解,最终一定能找到全局最优解。
问答题 共 2 题
1.

试题名称:数字移动

时间限制:1.0 s

内存限制:512.0 MB

3.1.1 题目描述

A 有一个包含 N 个正整数的序列 ,序列 A 恰好包含 N/2对不同的正整数。形式化地,对于任意 1<=i<=N,存在唯一一个 j 满足

A 希望每对相同的数字在序列中相邻,为了实现这一目的,小 A 每次操作会选择任意 i ( 1<=i<=N),将当前序列的第 i 个数字移动到任意位置,并花费对应数字的体力。

例如,假设序列 A={1,2,1,3,2,3.},小 A 可以选择 i=2 ,将 A2=2移动到 A3=1的后面,此时序列变为{1,1,2,3,2,3.},耗费 2 点体力。小 A 也可以选择 i=3,将 A3=1移动到A2=2 的前面,此时序列变为{1,1,2,3,2,3.},花费 1 点体力。

A 可以执行任意次操作,但他希望自己每次花费的体力尽可能小。小 A 希望你能帮他计算出一个最小的 x ,使得他能够在每次花费的体力均不超过 x 的情况下令每对相同的数字在序列中相邻。

3.1.2 输入格式

第一行一个正整数 N ,代表序列长度,保证 N 为偶数。

数据保证小 A 至少需要执行一次操作。

3.1.3 输出格式

输出一行,代表满足要求的 x 的最小值。

3.1.4 样例

3.1.4.1 输入样例

6
1 2 1 3 2 3


3.1.4.2 输出样例

2


3.1.5 数据范围

2.

试题名称:相等序列

时间限制:1.0 s

内存限制:512.0 MB

3.2.1 题目描述

A 有一个包含 N 个正整数的序列 A={A1,A2,...AN}。小 A 每次可以花费 1 个金币执行以下任意一种操作:

选择序列中一个正整数 Ai(1<=i<=N ),将 A变为 Ai *P P为任意质数;

选择序列中一个正整数 Ai(1<=i<=N ,将 Ai  变为 A/P p为任意质数,要求 Ai能整除 P

A 想请你帮他计算出令序列中所有整数都相同,最少需要花费多少金币。

3.2.2 输入格式

第一行一个正整数 N,含义如题面所示。

第二行包含N 个正整数 A1,A2,...AN,代表序列 A

3.2.3 输出格式

输出一行,代表最少需要花费的金币数量。

3.2.4 样例

3.2.4.1 输入样例

5
10 6 35 105 42


3.2.4.2 输出样例

8


3.2.5 数据范围

C++ 编辑器
输入
输出