CSP-J 2024 初赛解析

news/2024/9/22 1:48:59

时间紧任务重,可能有误,烦请指正 QwQ


第1题 (2分)

32 位 int 类型的存储范围是?

A. -2147483647 ~ +2147483647

B. -2147483647 ~ +2147483648

C. -2147483648 ~ +2147483647

D. -2147483648 ~ +2147483648

32 位 int 类型,除最高位为符号位外,剩下 31 位均为数字。但 0 的二进制最高位也是 0,所以除了 0 以外,正整数部分只有 \(2^{31} - 1 = 2147483647\) 个数,而负整数部分有 \(2^{31} = 2147483648\) 个数字。

第2题 (2分)

计算 \((14_8 − 1010_2) \times D_{16} − 1101_2\)的结果,并选择答案的十进制值:

A. 13

B. 14

C. 15

D. 16

\(14_8 = 12_{10}\)

\(1010_2 = 10_{10}\)

\(D_{16} = 13_{10}\)

\(1101_2 = 13_{10}\)

\((12 - 10) \times 13 - 13 = 13\)

第3题 (2分)

某公司有 10 名员工,分为 3 个部门:A 部门有 4 名员工,B 部门有 3 名员工、C 部门有 3 名员工。现需要从这 10 名员工中选出 4 名组成一个工作小组,且每个部门至少要有 1 人。问有多少种选择方式?

A. 120

B. 126

C. 132

D. 238

分类讨论,三个部门选四个人,且每个部门至少要有一人

① A部门选两人,其他部门选一人,\(C_4^2\times C_3^1 \times C_3^1 = 54\)

② B部门选两人,其他部门选一人,\(C_4^1\times C_3^2 \times C_3^1 = 36\)

① C部门选两人,其他部门选一人,\(C_4^1\times C_3^1 \times C_3^2 = 36\)

\(54+36+36=126\)

第4题 (2分)

以下哪个序列对应数字 0 至 7 的 4 位二进制格雷码(Gray code)?

A. 0000,0001,0011,0010,0110,0111,0101,1000

B. 0000,0001,0011,0010,0110,0111,0100,0101

C. 0000,0001,0011,0010,0100,0101,0111,0110

D. 0000,0001,0011,0010,0110,0111,0101,0100

格雷码的性质为:

  • 相邻两个编码只能有一位不同
  • 首尾两个编码视作相邻,也只能有一位不同
  • 同一编码不能重复出现

明显只有 D 选项符合条件

第5题 (2分)

记 1KB 为 1024 字节(byte)、1MB 为 1024KB,那么 1MB 是多少二进制位(bit)?

A. 1000000

B. 1048576

C. 8000000

D. 8388608

\(1\text{ MB} = 1024\text{ KB} = 1024\times 1024 \text{ B} = 1024 \times 1024 \times 8 \text{ bit} = 8388608\text{ bit}\)

第6题 (2分)

以下哪个不是 C++中的基本数据类型?

A. int

B. float

C. struct

D. char

struct 结构体不算基本类型

第7题 (2分)

以下哪个不是 C++ 中的循环语句?

A. for

B. while

C. do-while

D. repeat-until

可以用排除法做

do-while 是先做一次循环内的代码,再根据条件循环执行的语句,也是 C++ 的语句

第8题 (2分)

在 C/C++ 中,(char)('a'+13) 与下面的哪一个值相等?

A. 'm'

B. 'n'

C. 'z'

D. '3'

ASCII 码表中,小写英文字母是按照字母表顺序连续出现的

'a' + 13 就是从 'a' 开始往后数 13 个字母,即 'n'

第9题 (2分)

假设有序表中有 1000 个元素,则用二分法查找元素 X 最多需要比较( )次。

A. 25

B. 10

C. 7

D. 1

二分法查找 时间复杂度是以 2 为底数的对数,即 \(\log_2 n\)

\(n = 1000\) 时,\(\log_2 1000 \approx 10\)

或者可以模拟二分的过程,每次二分后要么直接找到对应数字,要么剩余数量变成原来的一半,观察做多少次可以剩 \(1\) 个数字即可

第10题 (2分)

下面哪一个不是操作系统名字?

A. Notepad

B. Linux

C. Windows

D. macOS

Notepad 是记事本

第11题 (2分)

在无向图中,所有顶点的度数之和等于( )。

A. 图的边数

B. 图的边数的两倍

C. 图的顶点数

D. 图的顶点数的两倍

无向图中,每条边连接两个点

根据度数的定义,无向图中点的度数就是有多少条边连接着当前点

那么每条边对于总度数的贡献就是 \(2\)

即无向图的总度数一定等于边数 \(\times 2\)

第12题 (2分)

已知二叉树的前序遍历为 [A, B, D, E, C, F, G],中序遍历为 [D, B, E, A, F, C, G],请问该二叉树的后序遍历结果是( )?

A. [D, E, B, F, G, C, A]

B. [D, E, B, F, G, A, C]

C. [D, B, E, F, G, C, A]

D. [D, B, E, F, G, A, C]

画图可得,这是一棵 7 个结点的满二叉树

第13题 (2分)

给定一个空栈,支持入栈和出栈操作。若入栈操作的元素依次是 1 2 3 4 5 6,其中 1 最先入栈,6 最后入栈,下面哪种出栈顺序是不可能的?

A. 6 5 4 3 2 1

B. 1 6 5 4 3 2

C. 2 4 6 5 3 1

D. 1 3 5 2 4 6

模拟即可,明显 D 选项在 1 3 5 出栈后,栈顶元素不论如何都不可能是 2

第14题 (2分)

有 5 个男生和 3 个女生站成一排,规定 3 个女生必须相邻,问有多少种不同的排列方式?

A. 4320 种

B. 5040 种

C. 3600 种

D. 2880 种

三个女生必须相邻,不妨假设三个女生为一个整体,与其余五个男生之间的站位方案数为 \(A_6^6 = 6! = 720\)

三个女生内部也存在 \(A_3^3 = 3! = 6\) 种站位

因此总方案数为 \(720 \times 6 = 4320\)

第15题 (2分)

编译器的主要作用是什么?

A. 直接执行源代码

B. 将源代码转换为机器代码

C. 进行代码调试

D. 管理程序运行时的内存

A 源代码没法直接执行

C 调试功能是编辑器提供的

D 管理计算机运行过程中的资源是操作系统干的活

第 16 题 (10.5 分)

img

img

观察程序可知

isPrime(n) 函数在判断整数 n 是否是一个素数

countPrimes(n) 函数在求 \(2 \sim n\) 之间的素数数量

sumPrimes(n) 函数在求 \(2 \sim n\) 之间的素数总和

程序输入一个整数 \(x\),输出两个整数:\(2\sim x\) 的素数数量以及 \(2 \sim x\) 的素数和

第16 - 1题(1.5 分)

当输入为 "10" 时,程序的第一个输出为 "4",第二个输出为 "17"。

A. 对

B. 错

\(10\) 以内的素数有 \(2, 3, 5, 7\)

数量为 \(4\),总和为 \(17\)

第16 - 2题(1.5 分)

若将 isPrime(i) 函数中的条件改为 i <= n / 2,输入"20" 时,countPrimes(20) 的输出将变为 "6"。

A. 对

B. 错

首先观察代码第 6 到 9 行,发现小于 \(2\) 的情况都已经被排除了,接下来循环过程一定满足 \(n \ge 2\)

原本的代码是 i * i <= n,就是说 \(i\) 不会超过 \(\lfloor \sqrt n \rfloor\)

而改后的代码 i <= n / 2 表示 \(i\) 不超过 \(\lfloor \dfrac n 2\rfloor\)

发现在 \(n \ge 2\) 时,\(\lfloor \sqrt n \rfloor \le \lfloor \dfrac n 2\rfloor\) 一定成立

所以改后无非就是时间复杂度从 \(O(\sqrt n)\) 变成了 \(O(n)\),对答案无影响

输入 \(20\) 时,\(20\) 以内的素数有 \(2,3,5,7,11,13,17,19\),共 \(8\)

第16 - 3题(1.5 分)

sumPrimes 函数计算的是从 2 到 n 之间的所有素数之和。

A. 对

B. 错

易得

第16 - 4题(3 分)

当输入为 "50" 时,sumPrimes(50) 的输出为( )。

A.1060

B.328

C.381

D.275

\(50\) 以内的素数为 \(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47\)

总和为 \(328\)

第16 - 5题(3 分)

如果将 for (int i = 2; i * i <= n; i++) 改为 for (int i = 2; i <= n; i++),输入 "10" 时,程序的输出( )。

A.将不能正确计算 10 以内素数个数及其和

B.仍然输出 "4" 和 "17"

C.输出 "3" 和 "10"

D.输出结果不变,但运行时间更短

改后 if(n % i == 0) 这一句判断一定会在 i == n 时成立

因此 return false 一定会执行

此时无法判断素数

第 17 题 (15 分)

img

虽然是一道线性动态规划,但很明显简单递推一下也能做题

如果想要充分理解代码的意思,可以给这道题定一个题目背景:

小明现在想要上楼梯,共有 \(n+1\) 级台阶,其中第 \(1\)\(n\) 级的每一级台阶上都有一个整数,第 \(i\) 级台阶上的整数是 cost[i - 1]

小明现在正站在第 \(0\) 级台阶上,每一步他可以向上走 \(1\) 级或者跨 \(2\) 级,并且每一步走完之后,他都要把当前位置台阶上的数字加到答案里去,直到他走到第 \(n+1\) 级台阶上为止

问答案的最小值

加个背景的话可能题目就好理解多了,现在来简单分析下代码

首先输入的 cost 数组下标是从 0 开始的,而动态规划过程中的 dp 数组下标是从 1 开始的,不要搞混

小明一开始就站在第 \(0\) 级台阶上,所以 初始状态为 dp[0] = 0,但代码中没写出来,也没关系

如果想走到第 \(1\) 级台阶上,那么就只能从第 \(0\) 级台阶走上来,所以dp[1] = dp[0] + cost[1 - 1],也就是 dp[1] = cost[0]

从第 \(2\) 级台阶开始,第 \(i\) 级台阶的上一步只有第 \(i-1\) 级和第 \(i-2\) 级两种情况,两种情况取个最小值转移过来即可,所以这一部分的状态转移方程为 dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1]

最后目标是走到第 \(n+1\) 级台阶上,但由于第 \(n+1\) 级台阶没有数字,所以不能用 cost 数组,又由于 dp[n+1] = min(dp[n], dp[n-1]),所以直接 return 作为答案了

第17 - 1题(1.5 分)

当输入的 cost 数组为 {10, 15, 20} 时,程序的输出为 15。

A.对

B.错

模拟即可

第17 - 2题(1.5 分)

如果将 dp[i - 1] 改为 dp[i - 3],程序可能会产生编译错误。

A.对

B.错

数组越界出现的是运行时错误,不是编译错误

第17 - 3题(2 分)

程序总是输出 cost 数组中最小的元素。

A.对

B.错

明显不是取最小值输出

第17 - 4题(3 分)

当输入的 cost 数组为 {1, 100, 1, 1, 1, 100, 1, 1, 100, 1} 时,程序的输出为( )。

A.6

B.7

C.8

D.9

模拟即可,加到答案里的数字对应的下标可以是 \((1, 3, 5, 7, 8, 10)\)

第17 - 5题(4 分)

如果输入的 cost 数组为 {10, 15, 30, 5, 5, 10, 20},程序的输出为( )。

A.25

B.30

C.35

D.40

模拟即可,加到答案里的数字对应的下标可以是 \((2, 4, 6)\)

第17 - 6题(3 分)

若将代码中的 min(dp[i - 1], dp[i - 2]) + cost[i - 1] 修改为 dp[i - 1] + cost[i - 2],输入 cost 数组为 {5, 10, 15} 时,程序的输出为( )。

A.10

B.15

C.20

D.25

相当于完全变成了一个递推

  • dp[0] = 0
  • dp[1] = cost[0] = 5
  • dp[2] = dp[1] + cost[0] = 5 + 5 = 10
  • dp[3] = dp[2] + cost[1] = 10 + 10 = 20

最后的答案是 min(dp[2], dp[3]) = 10

第18 题 (14.5 分)

img

分析 customFunction 这个函数,发现每次只有参数 b 会变成 b-1,并且过程中每次递归会把下一层答案 +a 后返回给上一层

观察到 b == 0 时遇到边界结束,所以总共递归 b 层,过程中共有 ba 相加

但在 b == 0 时执行了 return a,所以最终答案里是有 b+1a 相加

综上,customFunction(a, b) 的功能就是计算 \(a \times (b + 1)\)

最后输出的是 pow(result, 2),也就是说程序输入了两个整数 \(x, y\),然后输出 \((x \times (y + 1)) ^ 2\)

第18 - 1题(1.5 分)

当输入为 "2 3" 时,customFunction(2, 3) 的返回值为 "64"。

A.对

B.错

注意问的是函数返回值,而不是输出是什么!

返回值是 \(2 \times 4 = 8\)

第18 - 2题(1.5 分)

当 b 为负数时,customFunction (a, b) 会陷入无限递归。

A.对

B.错

边界条件是 b == 0,递归过程中 b 每次会减少,因此在 b 为负数时会无限递归下去

但有的同学可能会认为,int 类型减到负整数最小值之后,再 \(-1\) 会变成正整数最大值,最终执行 \(2^{32}\) 层递归之后确实还是会出现 b == 0 的情况。但这里要注意,递归函数执行调用的是栈空间,栈空间能够支持的递归层数远小于 \(2^{32}\) 这一级别的数字。(即使支持,这也肯定会超出题目的空间限制)(即使题目空间限制给得很宽,目前家用电脑的内存容量也不支持)

第18 - 3题(1.5 分)

当 b 的值越大,程序的运行时间越长。

A.对

B.错

如果 b 是正整数,递归的时间复杂度是 \(O(b)\),运行时间确实会随着 b 的变大而变长

但上一题又问了负数的情况,所以有些小歧义,但负数时到后面会出现运行时错误,不算正常执行完程序,应该也可以不考虑

第18 - 4题(3 分)

当输入为 "5 4" 时,customFunction(5, 4) 的返回值为( )。

A.5

B.25

C.250

D.625

问的是返回值

\(5 \times (4 + 1) = 25\)

第18 - 5题(3 分)

如果输入 x = 3 和 y = 3,则程序的最终输出为( )。

A."27"

B. "81"

C."144"

D."256"

\(\text{result} = 3 \times (3 + 1) = 12\)

\(12 ^ 2 = 144\)

第18 - 6题(4 分)

若将 customFunction 函数改为 "return a + customFunction(a-1, b-1)" 并输入 "3 3",则程序的最终输出为

A.9

B.16

C.25

D.36

模拟一遍

customFunction(3, 3)

= 3 + customFunction(2, 2)

= 3 + 2 + customFunction(1, 1)

= 3 + 2 + 1 + customFunction(0, 0)

= 3 + 2 + 1 + 0

= 6

\(6^2 = 36\)

第19 题 (15 分)

(判断平方数)

问题:给定一个正整数 n,希望判断这个数是否为完全平方数,即存在一个正整数 x 使得 x 的平方为 n。

试补全程序。

(实际上从原理上讲,这题函数里也可以直接 return bound * bound == num;,没必要用到循环,但题目就这样考了,那就 for 一遍找答案吧)

根据题目意思,如果我们找到一个正整数 \(x\),满足 \(x^2 = n\),那么 \(n\) 就是一个完全平方数

所以这里采用循环来找这个正整数 \(x\)

发现 \(x^2 = n\) 可以看作 \(x = \sqrt n\),所以要找的数字一定不会超过 \(\sqrt n\)

所以只需要把 \(1 \sim \sqrt n\) 内的每一个整数看一遍,观察是否存在某个整数的平方等于 \(n\) 即可

第19 - 1题(3 分)

①处应填( )

A.1

B.2

C.3

D.4

题干中提到,我们要找的 \(x\) 是一个正整数,所以循环 \(i\) 要从 \(1\) 开始

第19 - 2题(3 分)

②处应填( )

A.(int)floor(sqrt(num))-1

B.(int)floor(sqrt(num))

C.floor(sqrt(num/2))-1

D.floor(sqrt(num/2))

这里的 sqrt 表示取平方根,floor 表示向下取整

根据第 8 行循环条件可以判断出 bound 变量表示的就是最大边界,所以 bound 应该等于 \(\sqrt{\text{num}}\)

因为 bound 是整数,所以可以把 \(\lfloor \sqrt{\text{num}} \rfloor\) 交给它

四个选项中,只有 B 选项等于 \(\lfloor \sqrt{\text{num}} \rfloor\)

第19 - 3题(3 分)

③处应填( )

A.num = 2 * i

B.num == 2 * i

C.num = i * i

D.num == i * i

现在是假设循环变量 \(i\) 就是我们要找的 \(x\)

所以要判断的是 \(i^2 = \text{num}\) 是否成立

第19 - 4题(3 分)

④处应填( )

A.num = 2 * i

B.num == 2 * i

C.true

D.false

选完第三个空之后,发现只要第三个空的条件成立,就说明 num 是一个完全平方数

根据题意,这里直接 return true 即可

第19 - 5题(3 分)

⑤处应填( )

A.num = i * i

B.num != i * i

C.true

D.false

填完第四个空后,根据题意,如果循环结束后都没有执行任何一次 return true,就说明 \(1 \sim \sqrt{\text{num}}\) 中找不到任何一个数字的平方等于 \(\text{num}\),此时直接 return false 即可

第20 题 (15 分)

(汉诺塔问题)

给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:

  1. 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
  2. 每次只能移动一个圆盘。
  3. 小圆盘必须始终在大圆盘之上。

试补全程序。

一道非常经典的汉诺塔题目

以及

一份非常经典的汉诺塔代码

为了能把 src 上的 \(i\) 个盘子移动到 tgt 上,我们可以借助递归分三步走:

  • 先把起始柱 src 上面的 \(i-1\) 个盘子先借助 tgt 移动到中间柱 tmp
    • 移动完成后,目标柱 tgt 为空
  • 再把最大的这个盘子从 src 移动到 tgt
    • 移动完成后,起始柱 src 为空
  • 再把第一步中的 \(i-1\) 个盘子借助 src 移动到目标柱 tgt

move(src, tgt) 函数就表示执行一次移动,从 src 移动到 tgt

dfs(i, src, tmp, tgt) 表示递归,将 \(i\) 个盘子从 src 移动到 tgt 上,中间柱是 tmp

第20 - 1题(3 分)

①处应填( )

A.0

B.1

C.2

D.3

明显仅当只剩一个盘子的时候,可以执行一次第 10 行的 move,然后结束递归

(如果条件里面没有 move 直接 return 了,应当对应无盘子的情况,要选 i == 0

第20 - 2题(3 分)

②处应填( )

A.src, tmp

B.src, tgt

C.tmp, tgt

D.tgt, tmp

只剩一个盘子时,直接从 src 移动到 tgt 即可,不用管 tmp

第20 - 3题(3 分)

③处应填( )

A.src, tmp, tgt

B.src, tgt, tmp

C.tgt, tmp, src

D.tgt, src, tmp

三步走中的第一步,先把 \(i-1\) 个盘子从 src 开始,借助 tgt 移动到 tmp

第20 - 4题(3 分)

④处应填( )

A.src, tmp, tgt

B.tmp, src, tgt

C.src, tgt, tmp

D.tgt, src, tmp

三步走中的第三步,要把第一步移动到 tmp 上的 \(i-1\) 个盘子,再从 tmp 开始,借助 src 移动到 tgt

第20 - 5题(3 分)

⑤处应填( )

A.0

B.1

C.i - 1

D.i

同上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

《MySQL 进阶篇》二十:锁

MySQL 锁的分类,表锁和行锁有哪些类型?Author: ACatSmiling Since: 2024-09-21锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),就需要保证这个…

《MySQL 进阶篇》二十一:MVCC

MySQL 是如何处理并发问题的?什么是 MVCC?MVCC 的原理是什么?Author: ACatSmiling Since: 2024-09-21什么是 MVCC MVCC:Multiversion Concurrency Control,多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在 InnoDB 的事…

15.Python基础篇-文件操作

文件的打开与关闭 第一种方法:open函数 open函数:打开一个文件,并返回文件对象。如果文件无法打开,会抛出 OSError异常。 open函数的参数介绍: file参数 要打开的文件路径。可以是绝对路径也可以是相对路径 mode参数 打开文件的模式。分为:r:只读。文件的指针会放在文件…

《MySQL 进阶篇》十七:数据库其他调优策略

MySQL 数据库的其他调优策略。Author: ACatSmiling Since: 2024-09-21数据库调优的措施 调优的目标尽可能节省系统资源,以便系统可以提供更大负荷的服务(吞吐量更大)。 合理的结构设计和参数调整,以提高用户操作响应的速度(响应速度更快)。 减少系统的瓶颈,提高 MySQL 数…

《MySQL 进阶篇》十九:事务日志

MySQL redo log 和 undo log。Author: ACatSmiling Since: 2024-09-21事务有 4 种特性:原子性、一致性、隔离性和持久性。那么事务的 4 种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。 而事务的原子性、一致性和持久性由事务的redo log和undo log来保证。redo l…

《MySQL 进阶篇》十八:事务基础知识

MySQL 事务的定义、ACID 特性,以及事务的隔离级别。Author: ACatSmiling Since: 2024-09-21数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会…

《MySQL 进阶篇》十五:索引优化和查询优化

MySQL 索引优化,以及查询优化。Author: ACatSmiling Since: 2024-09-21数据库调优的维度:索引失效、没有充分利用所以 —— 索引建立。 关联查询太多 JOIN(设计缺陷或不得已的需求)—— SQL 优化。 服务器调优及各个参数设置(缓冲、 线程数)—— 调整 my.cnf。 数据过多 …

《MySQL 进阶篇》十六:数据库的设计规范

MySQL 数据库设计需要遵循什么规范?什么是范式?什么是反范式?Author: ACatSmiling Since: 2024-09-21为什么需要数据库设计 我们在设计数据表的时候,要考虑很多问题。比如:用户都需要什么数据?需要在数据表中保存哪些数据? 如何保证数据表中数据的正确性?当插入、删除、…