Logo

2023年 CSP-J 第一轮(入门级)

CSP-J · CSP-J级 · 2023-09

120:00
满分 100
时长 120 分钟
42
答题卡 已答 0/42
已答 正确 错误 编程题

单项选择题(共 15 题,共 0 分)

1

在 C++ 中,下面哪个关键字用于声明一个变量,其值不能被修改

2

八进制数 $12345670_8$ 和 $07654321_8$ 的和为

3

阅读下述代码,请问修改 datavalue 成员以存储 3.14,正确的方式是

union Data {
    int num;
    float value;
    char symbol;
};
union Data data;
4

假设有一个链表的节点定义如下:

struct Node {
    int data;
    Node* next;
};

现在有一个指向链表头部的指针: Node* head。如果想要在链表中插入一个新节点,其成员 data 的值为 $42$,并使新节点成为链表的第一个节点,下面哪个操作是正确的?

5

根节点的高度为 $1$,一棵拥有 $2023$ 个节点的三叉树高度至少为

6

小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息,则小明一共有( )种选择时间段的方案。

7

以下关于高精度运算的说法错误的是( )

8

后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )

9

数 $101010_2$ 和 $166_8$ 的和为( )

10

假设有一组字符 ${a,b,c,d,e,f}$,对应的频率为 $5$%、$9$%、$12$%、$13$%、$16$%、$45$%。请问以下哪个选项是字符 $a,b,c,d,e,f$ 分别对应的一组哈夫曼编码?

11

给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?

12

考虑一个有向无环图,该图包含 $4$ 条有向边:$(1, 2)$,$(1, 3)$,$(2,4)$ 和 $(3, 4)$。以下哪个选顶是这个有向无环图的一个有效的拓扑排序?

[图片]

13

在计算机中,以下哪个选项描述的数据存储容量最小?

14

一个班级有 $10$ 个男生和 $12$ 个女生,如果要选出一个 $3$ 人的小组,并且小组中必须至少包含 $1$ 个女生,那么有多少种可能的组合?

15

以下哪个不是操作系统?

阅读程序(共 17 题,共 0 分)

程序代码 请先阅读以下程序
#include <iostream>
#include <cmath>
using namespace std;

double f(double a, double b, double c){
    double s = (a + b + c) / 2;
    return sqrt(s * (s - a) * (s - b) * (s - c));
}

int main(){
    cout.flags(ios::fixed);
    cout.precision(4);
    
    int a, b, c;
    cin >> a >> b >> c;
    cout << f(a, b, c) << endl;
    return 0;
}
16

输入的所有数都为不超过 $1000$ 的正整数。完成下面的判断题。

当输入为 2 2 2 时,输出为 1.7321

17

输入的所有数都为不超过 $1000$ 的正整数。完成下面的判断题。

将第 7 行中的 (s - b) * (s - c) 改为 (s - c) * (s - b) 不会影响程序运行的结果。

18

输入的所有数都为不超过 $1000$ 的正整数。完成下面的判断题。

程序总是输出四位小数。

19

输入的所有数都为不超过 $1000$ 的正整数。完成下面的选择题。

当输入为 3 4 5 时,输出为( )

20

输入的所有数都为不超过 $1000$ 的正整数。完成下面的选择题。

当输入为 5 12 13 时,输出为( )

程序代码 请先阅读以下程序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int f(string x, string y) {
    int m = x.size();
    int n = y.size();
    vector<vector<int>> v(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; i++){
        for (int j = 1; j <= n; j++){
            if (x[i-1] == y[j-1]){
                v[i][j] = v[i-1][j-1] + 1;
            } else {
                v[i][j] = max(v[i-1][j], v[i][j-1]);
            }
        }
    }
    return v[m][n];
}

bool g(string x, string y) {
    if(x.size() != y.size()){
        return false;
    }
    return f(x + x, y) == y.size();
}

int main() {
    string x, y;
    cin >> x >> y;
    cout << g(x, y) << endl;
    return 0;
}
21

f 函数的返回值小于等于 min(n, m)

22

f 函数的返回值等于两个输入字符串的最长公共子串的长度。

23

当输入两个完全相同的字符串时,g 函数的返回值总是 true

24

将第 19 行中的 v[m][n] 替换为 v[n][m],那么该程序( )

25

当输入为 csp-j p-jcs 时,输出为( )

26

当输入为 csppsc spsccp 时,输出为( )。

程序代码 请先阅读以下程序
#include <iostream>
#include <cmath>
using namespace std;

int solve1(int n) {
    return n * n;
}

int solve2(int n) {
    int sum = 0;
    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
            if (n / i == i) {
                sum += i * i;
            } else {
                sum += i * i + (n / i) * (n / i);
            }
        }
    }
    return sum;
}

int main() {
    int n;
    cin >> n;
    cout << solve2(solve1(n)) << " " << solve1(solve2(n)) << endl;
    return 0;
}
27

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的判断题。

如果输入的 n 为正整数,solve2 函数的作用是计算 n 所有的因子的平方和。

28

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的判断题。

第 13~14 行的作用是避免 n 的平方根因子 i(或 n / i)进入第 16 行而被计算两次。

29

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的判断题。

如果输入的 n 为质数,solve2(n) 的返回值为 $n^{2} + 1$。

30

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的选择题。

如果输入的 n 为质数 $p$ 的平方,那么 solve2(n) 的返回值为( )。

31

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的选择题。

当输入为正整数时,第一项减去第二项的差值一定( )。

32

假设输入的 n 是绝对值不超过 $1000$ 的整数。完成下面的选择题。

当输入为 5 时,输出为( )。

完善程序(共 10 题,共 0 分)

程序代码 请先阅读以下程序
#include <iostream>
#include <vector>

using namespace std;

int find_missing(vector<int>& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == mid + ①) {
            ②;
        } else {
            ③;
        }
    }
    return ④;
}

int main() {
    int n;
    cin >> n;
    vector <int> nums(n);
    for (int i = 0; i < n; i++) cin >> nums[i];
    int missing_number = find_missing(nums);
    if (missing_number == ⑤) {
        cout << "Sequence is consecutive" << endl;
    } else {
        cout << "Missing number is " << missing_number << endl;
    }
    return 0;
}
33

(寻找被移除的元素)问题:原有长度为 $n+1$,公差为 $1$ 的等差升序数列:将数列输入到程序的数组时移除了一个元素,导致长度为 $n$ 的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。

试补全程序。

① 处应该填 ( )

34

(寻找被移除的元素)问题:原有长度为 $n+1$, 公差为 $1$ 的等差升序数列:将数列输入到程序的数组时移除了一个元素,导致长度为 $n$ 的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。

试补全程序。

② 处应该填 ( )

35

(寻找被移除的元素)问题:原有长度为 $n+1$, 公差为 $1$ 的等差升序数列:将数列输入到程序的数组时移除了一个元素,导致长度为 $n$ 的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。

试补全程序。

③ 处应该填 ( )

36

(寻找被移除的元素)问题:原有长度为 $n+1$, 公差为 $1$ 的等差升序数列:将数列输入到程序的数组时移除了一个元素,导致长度为 $n$ 的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。

试补全程序。

④ 处应该填 ( )

37

(寻找被移除的元素)问题:原有长度为 $n+1$, 公差为 $1$ 的等差升序数列:将数列输入到程序的数组时移除了一个元素,导致长度为 $n$ 的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。

试补全程序。

⑤ 处应该填 ( )

程序代码 请先阅读以下程序
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int min(int x, int y, int z) {
    return min(min(x, y), z);
}

int edit_dist_dp(string str1, string str2) {
    int m = str1.length();
    int n = str2.length();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0)
                dp[i][j] = ①;
            else if (j == 0)
                dp[i][j] = ②;
            else if (③)
                dp[i][j] = ④;
            else
                dp[i][j] =  1 + min(dp[i][j - 1], dp[i - 1][j], ⑤);
        }
    }
    return dp[m][n];
}

int main() {
    string str1, str2;
    cin >> str1 >> str2;
    cout << "Minimum number of operations: "
         << edit_dist_dp(str1, str2) << endl;
    return 0;
}
38

(编辑距离)给定两个字符串,毎次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)

一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

试补全动态规划算法。

①处应填( )

39

(编辑距离)给定两个字符串,毎次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)

一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

试补全动态规划算法。

②处应填( )

40

(编辑距离)给定两个字符串,毎次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)

一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

试补全动态规划算法。

③处应填( )

41

(编辑距离)给定两个字符串,毎次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)

一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

试补全动态规划算法。

④处应填( )

42

(编辑距离)给定两个字符串,毎次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)

一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

试补全动态规划算法。

⑤处应填( )

已答 0/42