Logo

2024年12月 GESP C++ 8级

GESP · 8级 · 2024-12

60:00
满分 100
时长 60 分钟
27

2024年12月 GESP C++ 8级认证考试真题(含编程操作题部分)

答题卡 已答 0/27
已答 正确 错误 编程题

单选题(共 15 题,每题 2 分)

1

小杨家响应国家“以旧换新”政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括5
位数字或英文字母,要求第5位必须是数字,前4位中可以有最多1位英文字母。英文字母必须是大写,⽽且不能是O
或I(因为容易与数字0或1混淆)。请问自编车牌共有多少种可能性?( )。

2

新年到,四家⼈在一起聚会。其中两家有三⼝⼈,另外两家有两⼝⼈。现在要安排大家在一张十⼈圆桌坐
下,要求一家⼈必须相邻就座。由于有“主座”的习俗,每个座位都被认为是不同的。请问共有多少种就座方案?(
)。

3

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

4

使用邻接表表达一个简单有向图,图中包含v个顶点、e条边,则该出边表中边节点的个数为( )。

5

以下将二维数组作为参数的函数声明,哪个是符合语法的?( )。

6

已知两个点

7

二项式 的展开式中 项的系数是( )。

8

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

9

在下面的程序中,使用整数表⽰一种组合。整数二进制表⽰的某一位为1,表⽰该位对应的数被选中,反之
为0表⽰未选中。例如,从0 - 5这6个数中选出3个,则0b111000代表选中3, 4, 5三个数,0b011001代表
选中0, 3, 4三个数。zuhe_next函数按组合对应的整数由大到小的顺序,求出组合c的下一个组合。横线处可
以填入的是( )。

int intlow2(int c) {
    return ________; // 在此处填入选项
}
int zuhe_next_incur(int c, int n, int l) {
    if (n == 1) return c;
    if ((c & (1 << l)) == 0) {
        int d = intlow2(c);
        c = (c & ~d);
        c = (c | (d >> 1));
    } else {
        c = (c & ~(1 << l));
        c = zuhe_next_incur(c, n - 1, l + 1);
        int d = intlow2(c);
        c = (c | (d >> 1));
    }
    return c;
}
// 从n个数中选m个,当前组合为c
int zuhe_next(int c, int n, int m) {
    return zuhe_next_incur(c, n, 0);
}
10

下面程序的输出为( )。

#include <iostream>
using namespace std;
int main() {
    int N = 15, cnt = 0;
    for (int x = 0; 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;
}
11

下面最长公共⼦序列程序中,横线处应该填入的是( )。

#define MAX(A, B) (((A) > (B)) ? (A) : (B))
#define MIN(A, B) (((A) < (B)) ? (A) : (B))
int dp[MAX_L + 1][MAX_L + 1];
int LCS(char str1[], char str2[]) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    for (int i = 0; i < len1; i++)
    for(int j = 0; j < len2; j++)
    if (str1[i] == str2[j])
    dp[i + 1][j + 1] = dp[i][j] + 1;
    else
    ________; // 在此处填入选项
    return dp[len1][len2];
}
12

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

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) {
            ________; // 在此处填入选项
        }
    }
    delete[] visited;
}
13

假设图graph中顶点数v、边数e,上题程序的时间复杂度为( )。

14

下面的快速排序程序中,两处横线处分别应填入的是( )。

void quick_sort(int a[], int n) {
    if (n <= 1)
    return;
    int pivot = 0, l = 0, r = n - 1;
    while (________) { // 在此处填入选项
        while (r > pivot && a[r] >= a[pivot])
        r--;
        if (r > pivot) {
            int temp = a[pivot];
            a[pivot] = a[r];
            a[r] = temp;
            pivot = r;
        }
        while (l < pivot && a[l] <= a[pivot])
        l++;
        if (l < pivot) {
            int temp = a[pivot];
            a[pivot] = a[l];
            a[l] = temp;
            pivot = l;
        }
    }
    quick_sort(a, pivot);
    quick_sort(________); // 在此处填入选项
}
15

上题程序的时间复杂度为( )。

判断题(共 10 题,每题 2 分)

16

表达式'3' + '5'的结果为'8',类型为char。

17

在C++语⾔中,可以在函数内定义结构体,但该结构体类型只能在该函数内使用。

18

对 个元素的数组进行排序,快速排序和归并排序的平均时间复杂度都为 。但快速排序存在退化情
况,使得时间复杂度升高至 ;归并排序需要额外的空间开销。

19

二维数组的最后一维在内存中一定是连续的,但第一维在内存中可能不连续。

20

使用math.h或cmath头文件中的函数,表达式log(1000)的结果类型为double、值约为3。

21

你有三种硬币,分别面值2元、5元和7元,每种硬币都有足够多。买一本书需要27元,则有8种硬币组合(组
合与顺序无关,“1个2元+1个5元+1个2元”与“1个5元+2个2元”认为是同样的组合)可以正好付清,且不需要对方找
钱。

22

使用哈希函数f(x) = x % p建⽴键值为int类型的哈希表,只要p取小于等于哈希表大小的素数,可保
证不发生碰撞。

23

杨辉三角中的第 行、第 项,即为将二项式 展开后 项的系数。

24

判断图是否连通,可以通过广度优先搜索实现。

25

要求解一元二次方程 ,需要先判断表达式a ^ 2 - b * 4 >= 0是否为真。

编程操作题(共 2 题,共 50 分)

26
编程操作题 25分

试题名称:树上移动

时间限制:1.0 s | 内存限制:512.0 MB

输入格式

第⼀⾏包含两个正整数 ,代表节点数量和⾄多经过的⿊⾊节点数。
第⼆⾏包含 个正整数 ,代表节点颜⾊,如果 ,代表节点颜⾊为⽩⾊,如果 ,代表节点
颜⾊为⿊⾊。
之后 ⾏,每⾏包含两个正整数 ,代表存在⼀条连接节点 和 的边。

输出格式

输出⼀个正整数,代表最多经过的节点数。

27
编程操作题 25分

试题名称:排队

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

⼩杨所在班级共有 位同学,依次以 标号。这 位同学想排成⼀⾏队伍,其中有些同学之间关系⾮常
好,在队伍⾥需要排在相邻的位置。具体来说,有 对这样的关系( 是⼀个⾮负整数)。当 时,第 对关
系( )给出 ,表⽰排队时编号为 的同学需要排在编号为 的同学前⾯,并且两⼈在队伍中相邻。
现在⼩杨想知道总共有多少种排队⽅式。由于答案可能很⼤,你只需要求出答案对 取模的结果。

输入格式

第⼀⾏,两个整数 ,分别表⽰同学们的数量与关系数量。
接下来 ⾏,每⾏两个整数 ,表⽰⼀对关系。

输出格式

⼀⾏,⼀个整数,表⽰答案对 取模的结果。

数据范围

对于 20% 的测试数据点,保证 , 。
对于另外 20% 的测试数据点,保证 , 。
对于所有测试数据点,保证 , 。

已答 0/27