#1500. GESP-C++七级(2023-12)

GESP-C++七级(2023-12)

CCF GESP C++ 七级 (2023 年 12 月)

一、单选题(每题 2 分,共 30 分)

第 1 题定义变量double x,如果下面代码输入为 100,输出最接近 ( )。

#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;

int main() {
    double x;
    cin >> x;
    cout << log10(x) - log2(x) << endl;
    cout << endl;
    return 0;
}

{{ select(1) }}

  • 0
  • -5
  • -8
  • 8

第 2 题对于下面动态规划方法实现的函数,以下选项中最适合表达其状态转移函数的为 ( )。

int s[MAX_N], f[MAX_N][MAX_N];
int stone_merge(int n, int a[]) {
    for (int i = 1; i <= n; i++)
        s[i] = s[i - 1] + a[i];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (i == j)
                f[i][j] = 0;
            else
                f[i][j] = MAX_F;
    for (int l = 1; l < n; l++)
        for (int i = 1; i <= n - l; i++) {
            int j = i + l;
            for (int k = i; k < j; k++)
                f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]);
        }
    return f[1][n];
}

{{ select(2) }}

  • $\ f(i,j)=\operatorname*{min}_{i\leq k<j}(f(i,j),f(i,k)+f(k+1,j)+s(j)-s(i-1))$
  • $\ f(i, j)=\min _{i \leq k<j}(f(i, j), f(i, k)+f(k+1, j)+\sum_{k=i}^{j} a(k))$
  • $\ f(i, j)=\min _{i \leq k \leq j}\left(f(i, k)+f(k+1, j)+\sum_{k=i}^{j+1} a(k)\right)$
  • $\ f(i, j)=\min _{i \leq k<j}(f(i, k)+f(k+1, j))+\sum_{k=i}^{j} a(k)$

第 3 题下面代码可以用来求最长上升子序列 (LIS) 的长度,如果输入是:5 1 7 3 5 9,则输出是 ( )。

int a[2023], f[2023];
int main() {
    int n, i, j, ans = -1;
    cin >> n;
    for (i = 1; i <= n; i++) {
        cin >> a[i];
        f[i] = 1;
    }
    for (i = 1; i <= n; i++)
        for (j = 1; j < i; j++)
            if (a[j] < a[i])
                f[i] = max(f[i], f[j] + 1);
    for (i = 1; i <= n; i++) {
        ans = max(ans, f[i]);
    }
    cout << ans << endl;
    return 0;
}

{{ select(3) }}

  • 9 7 5 1 1 9
  • 1 2 2 3 4 4
  • 1 3 5 7 9 9
  • 1 1 1 1 1 1

第 4 题C++ 语言中,下列关于关键字static的描述不正确的是 ( )。

{{ select(4) }}

  • 可以修饰类的成员函数。
  • 常量静态成员可以在类外进行初始化。
  • 若a是类A常量静态成员,则a的地址都可以访问且唯一。
  • 静态全局对象一定在main函数调用前完成初始化,执行完main函数后被析构。

第 5 题G 是一个非连通无向图,共有 28 条边,则该图至少有 ( ) 个顶点。

{{ select(5) }}

  • 6
  • 7
  • 8
  • 9

第 6 题哈希表长 31,按照下面的程序依次输入4 17 28 30 4,则最后的 4 存入哪个位置?( )

#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;

const int N = 31;
int htab[N], flag[N];
int main() {
    int n, x, i, k;
    cin >> n;
    for (i = 0; i < n; i++) {
        cin >> x;
        k = x % 13;
        while (flag[k])
            k = (k + 1) % 13;
        htab[k] = x;
        flag[k] = 1;
    }
    for (i = 0; i < N; i++)
        cout << htab[i] << " ";
    cout << endl;
    return 0;
}

{{ select(6) }}

  • 3
  • 4
  • 5
  • 6

第 7 题某二叉树 T 的先序遍历序列为:{A B D F C E G H},中序遍历序列为:{B F D A G E H C},则下列说法中正确的是 ( )。

{{ select(7) }}

  • T 的度为 1
  • T 的高为 4
  • T 有 4 个叶节点
  • 以上说法都不对

第 8 题下面代码段可以求两个字符串s1和s2的最长公共子串 (LCS),下列相关描述不正确的是 ( )。

while (cin >> s1 >> s2) {
    memset(dp, 0, sizeof(dp));
    int n1 = strlen(s1), n2 = strlen(s2);
    for (int i = 1; i <= n1; ++i)
        for (int j = 1; j <= n2; ++j)
            if (s1[i - 1] == s2[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
    cout << dp[n1][n2] << endl;
}

{{ select(8) }}

  • 代码的时间复杂度为 (O(n2)O(n^{2}))
  • 代码的空间复杂度为 (O(n2)O(n^{2}))
  • 空间复杂度已经最优
  • 采用了动态规划求解

第 9 题图的广度优先搜索中既要维护一个标志数组标志已访问的图的结点,还需哪种结构存放结点以实现遍历?( )

{{ select(9) }}

  • 双向栈
  • 队列
  • 哈希表

第 10 题对关键字序列 {44,36,23,35,52,73,90,58} 建立哈希表,哈希函数为h(k)=k%7,执行下面的Insert函数,则等概率情况下的平均成功查找长度(即查找成功时的关键字比较次数的均值)为 ( )。

#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;

typedef struct Node {
    int data;
    struct Node *next;
} Node;
Node* hTab[7];
int key[] = {44, 36, 23, 35, 52, 73, 90, 58, 0};

void Insert() {
    Node *x;
    int i, j;
    for (i = 0; key[i]; i++) {
        j = key[i] % 7;
        x = new Node;
        x->data = key[i];
        x->next = hTab[j];
        hTab[j] = x;
    }
    return;
}

{{ select(10) }}

  • 7/8
  • 1
  • 1.5
  • 2

第 11 题学生在读期间所上的某些课程中需要先上其他的课程,所有课程和课程间的先修关系构成一个有向图 G,有向边 <U, V> 表示课程 U 是课程 V 的先修课,则要找到某门课程 C 的全部先修课下面哪种方法不可行?( )

{{ select(11) }}

  • BFS 搜索
  • DFS 搜索
  • DFS+BFS
  • 动态规划

第 12 题一棵完全二叉树有 2023 个结点,则叶结点有多少个?( )

{{ select(12) }}

  • 1024
  • 1013
  • 1012
  • 1011

第 13 题用下面的邻接表结构保存一个有向图 G,InfoType和VertexType是定义好的类。设 G 有 n 个顶点、e 条弧,则求图 G 中某个顶点 u(其顶点序号为 k)的度的算法复杂度是 ( )。

typedef struct ArcNode {
    int adjvex; // 该弧所指向的顶点的位置
    struct ArcNode *nextarc; // 指向下一条弧的指针
    InfoType *info; // 该弧相关信息的指针
} ArcNode;

typedef struct VNode {
    VertexType data; // 顶点信息
    ArcNode *firstarc; // 指向
#### 第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];

typedef struct {
    AdjList vertices;
    int vexnum, arcnum;
    int kind; // 图的种类标志
} ALGraph;

{{ select(13) }}

  • O(n)O(n)
  • O(e)O(e)
  • O(n+e)O(n+e)
  • O(n+2e)O(n+2*e)

第 14 题给定一个简单有向图 G,判断其中是否存在环路的下列说法哪个最准确?( )

{{ select(14) }}

  • BFS 更快
  • DFS 更快
  • BFS 和 DFS 一样快
  • 不确定

第 15 题从顶点 v1 开始遍历下图 G 得到顶点访问序列,在下面所给的 4 个序列中符合广度优先的序列有几个?( )

{v1 v2 v3 v4 v5},{v1 v2 v4 v3 v5},{v1 v4 v2 v3 v5},{v1 v2 v4 v5 v3}

{{ select(15) }}

  • 4
  • 3
  • 2
  • 12

二、判断题(每题 2 分,共 20 分)

第 1 题小杨这学期准备参加 GESP 的 7 级考试,其中有关于三角函数的内容,他能够通过下面的代码找到结束循环的角度值。( )

int main() {
    double x;
    do {
        cin >> x;
        x = x / 180 * 3.14;
    } while (int(sin(x) * sin(x) + cos(x) * cos(x)) == 1);
    cout << "//" << sin(x) << " " << cos(x);
    cout << endl;
    return 0;
}

{{ select(16) }}

第 2 题小杨在开发画笔刷小程序 (applet),操作之一是选中黄颜色,然后在下面的左图的中间区域双击后,就变成了右图。这个操作可以用图的泛洪算法来实现。( )

{{ select(17) }}

第 3 题假设一棵完全二叉树共有 n 个节点,则树的深度为(文档未明确深度表达式)。( )

{{ select(18) }}

第 4 题给定一个数字序列 A1,A2,A3,...,An,要求 i 和 j(1<=i<=j<=n),使 Ai+…+Aj 最大,可以使用动态规划方法来求解。()

{{ select(19) }}

第 5 题若变量 x 为 double 类型正数,则log(exp(x)) > log10(x)。( )

{{ select(20) }}

第 6 题简单有向图有 n 个顶点和 e 条弧,可以用邻接矩阵或邻接表来存储,二者求节点 u 的度的时间复杂度一样。( )

{{ select(21) }}

第 7 题某个哈希表键值 x 为整数,为其定义哈希函数 (H(x)=x % p),则 p 选择素数时不会产生冲突。( )

{{ select(22) }}

第 8 题动态规划只要推导出状态转移方程,就可以写出递归程序来求出最优解。( )

{{ select(23) }}

第 9 题广度优先搜索 (BFS) 能够判断图是否连通。( )

{{ select(24) }}

第 10 题在 C++ 中,如果定义了构造函数,则创建对象时先执行完缺省的构造函数,再执行这个定义的构造函数。( )

{{ select(25) }}