2024年CSP-S第一轮认证试题解析

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

选择

第1题

1.在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?()

A. pwd

B. cd

C. Ls

D. echo

【答案】A

【解析】考察Linux命令,pwd全称print working directory,意思是打印当前工作目录。

选择

第2题

2. 假设一个长度为 n 的整数数组中每个元素互不相同,且这个数组是无序的。要找到这个数组中最大元素的时间复杂度是多少?()

A. O(n)

B. O(log n)

C. O(n log n)

D. O(1)

【答案】A

【解析】使用擂台法枚举整个数组可以得到答案。

选择

第3题

3. 在 C++中,以下哪个函数调用会造成栈溢出?()

A. int foo( return 0; )

B. Int bar( int x=1; return x)

C. Void baz(){int a[1000]; baz();}

D. Void qux(){return;}

【答案】C

【解析】在函数中定义局部变量,每次递归都会重新生成新的变量,而定义数组更容易导致栈溢出。

选择

第4题

4.在一场比赛中,有 10 名选手参加,前三名将获得金银铜牌,若不允许并列,且每名选手只能获得一枚铜牌,则不同的颁奖方式共有多少种?()

A.120

B.720

C.504

D.1000

【答案】B

【解析】乘法原理,金牌共有10种情况,银牌为剩下的9种,铜牌为8种,10×9×8=720。

选择

第5题

5. 下面那个数据结构最适合实现先进先出(FIFO)的功能?()

A. 栈

B. 队列

C. 线性表

D. 二叉搜索树

【答案】B

【解析】队列的所有元素都是队尾进入,队首离开,符合先进先出原则。

选择

第6题

6. 一直 f(1) = 1,且对于 n>=2 有 f(n) = f(n − 1) + f( n/2 ) ,则 f(4)的值为:()

A.4

B.5

C.6

D.7

【答案】B

【解析】f(2)=f(1)+f(1)=2,f(3)=f(2)+f(1)=3,f(4)=f(3)+f(2)=5。

选择

第7题

7. 假设一个包含 n 个顶点的无向图,且该图是欧拉图。一下关于该图的描述中哪一项不一定正确?()

A. 所有顶点的度数均为偶数

B. 该图联通

C. 该图存在一个欧拉回路

D. 该图的边数是奇数

【答案】D

【解析】欧拉图指的是可以找到一条经过每条边且仅经过一次的闭合路径的无向图或有向图,对边数没有要求。

选择

第8题

8. 对数组进行二分查找的过程中,以下哪个条件必须满足?()

A.数组必须是有序的

B.数组必须是无序的

C.数组长度必须是 2 的幂

D.数组中的元素必须是整数

【答案】A

【解析】二分查找的原理是根据中间点与目标点的大小关系,排除一半的下标范围,查找的数组必须有序,才能确定查找的新范围。

选择

第9题

9. 考虑一个自然数 n 以及一个模数 m,你需要计算 n 的逆元(即 n 在模 m 意义下的乘法逆元)。下列哪种算法最为合适?()

A. 使用暴力方法依次尝试

B. 使用扩展欧几里得解法

C. 使用快速幂解法

D. 使用线性筛法

【答案】B

【解析】扩展欧几里德算法可以它能找到两个整数 x 和 y 满足 ax + by = gcd(a, b)。当 a 和 b 互质时,即 gcd(a, b) = 1,这个方程变为 ax + by = 1。在模 b 意义下,ax 与1在模b时同余,因此 x 就是 a 的模 b 的逆元。使用快速幂需要保证m是一个质数,没有扩展欧几里得方便。

选择

第10题

10. 在设计一个哈希表时,为了减少冲突,需要使用适当的哈希函数和和冲突解决策略。已知某哈希表中有 n 个键值对,表的装载因子为α(0<α<=1)。在使用开放地址法解决冲突的过程中,最坏情况下查找一个元素的时间复杂度为()

A. O(1)

B. O(log n)

C. O (1/(1-α))

D. O(n)

【答案】D

【解析】‌开放地址法‌是‌哈希表处理冲突的一种方法。当哈希函数计算出的哈希地址被占用时,开放地址法会按照一定的策略在线性存储空间上探测其他位置,直到找到一个空位置来存储数据。如果哈希函数不够好,所有元素的哈希值都相同,那么查找最后一个元素需要把前面所有元素查找一遍。

选择

第11题

11. 假设有一颗 h 层的完全二叉树,该树最多包含多少个节点(    )

A2h− 1

B.2(h+1)− 1

C.2h

D.2h+1

【答案】A

【解析】完全二叉树第1层最多1个点,第2层最多2个点,第h层最多2^(h-1)个点,加起来是2^h-1个点。

选择

第12题

12. 设有一个 10 个顶点的完全图,每两个顶点之间都有一条边,有多少个长度为 4 的环?()

A.120

B.210

C.630

D.5040

【答案】C

【解析】10个点里面选4个点排列的方案数为10×9×8×7,但是四个点ABCD顺序确定后,可以形成4个不同起点,每个起点2个不同方向一共8个等价的排列(对应同一个环),因此有630个不同的环。

选择

第13题

13. 对于一个整数 n,定义 f(n)为 n 的各个位数之和,问使 f(f(x))=10 的最小自然数 x 是多少?()

A.29

B.199

C.299

D.399

【答案】B

【解析】代入式子直接计算。

选择

第14题

14. 设有一个长度为 n 的 01 字符串,其中有 k 个 1,每次操作可以交换相邻两个字符。在最坏的情况下将这 k 个 1 移到字符串最右边所需要的交换次数是多少?()

A. K

B. K*(k-1)/2

C. (n-k)*k

D. (2n-k-1)*k/2

【答案】C

【解析】最坏情况是初始所有的1都在最左边,那么前k个数全是1,移动时不会交换相邻的1,因此先把最右边的1(第k位)移到字符串最后面(第n位),需要n-k次,接下来把倒数第二个1(第k-1位)移到第n-1位,发现每个1的移动次数都是n-k次,总次数为(n-k)×k。

选择

第15题

15. 如图是一张包含 7 个顶点的有向图。如果要删除一些边,使得从节点 1 到节点 7 没有可行路径,且删除的边数最少,请问总共有多少种可行的删除边的集合?()

图片

A.1

B.2

C.3

D.4

【答案】D

【解析】首先最少需要删除两条边,删除方法有4种:删除②→⑤和④→⑥、删除⑤→⑦和⑥→⑦、删除①→②和④→⑥、删除⑤→⑦和④→⑥。

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×,除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

程序(1)

图片

阅读程序

(1)此题考察位运算和快速排序。题目只输入3个数字,然后使用generate函数生成有b个数字的数组c,接着对数组c进行最多d层的递归处理。通过分析可以发现,logic函数的功能就是求x|y的值,generate函数生成的数组c[i]=(a|i)%(b+1),recursion函数是限制深度最大为d的快速排序。

判断

第16题

16. 当 1000>=d>=b 时,输出的序列是有序的( )

【答案】√

【解析】 recursion函数明显就是快速排序,当d≥b,快速排序能排到最后一层,就能得到从小到大的数组。

判断

第17题

17. 当输入“5 5 1”时,输出为“1 1 5 5 5”( )

【答案】×

【解析】由于d=1,快排只能排第一层,不会得到有序数组的。如果把值带入计算,得到的结果是“5 1 1 5 5”。

判断

第18题

18. 假设数组 c 长度无限制,该程序所实现的算法的时间复杂度是 O(b)( )

【答案】×

【解析】快速排序的时间复杂度最低是O(blogb)。

单选

第19题

19. 函数 int logic(int x,int y)的功能是()

A. 按位与

B. 按位或

C. 按位异或

D. 以上都不是

答案】B

【解析】可以把四种情况代入计算结果,发现等价于或运算

单选

第20题

20. (4 分)当输入为“10 100 100”时,输出的第 100 个数是()

A.91

B.94

C.95

D.98

【答案】C

【解析】考虑d比较大,输出的第100个数一定是c数组的最大值,而c数组是0~99与10的或值,并且对101取模,通过二进制分析可以发现95的二进制是1011011,95|10得到95,95以上的数组或10会大于101,所以c数组的最大值是95。

程序(2)

图片

图片

图片

判断

第21题

21. 假设输入的 s 是包含 n 个字符的 01 串,函数 solve()所实现的算法时间复杂度是 O(n*2^m)。( )

【答案】√

【解析】

图片

判断

第22题

22. 输入“11 2 10000000001”时,程序输出两个数 32 和 23.( )

【答案】√

【解析】10000000001中有9个0,2个1,36个00,9个01,1个11,个。因此solve2输出1*2+1*9+2*9+3*1=32。solve2输出1*2+2*9+3*1=23

判断

第23题    

23. (2 分)在 n<=10 时,solve()的返回值始终小于410( )

【答案】√

【解析】当s全1,m=n时solve值最大。为

图片

单选

第24题

24. 当 n=10 且 m=10 时,有多少种输入使得两行的结果完全一致?()

A.1024

B.11

C.10

D.0

【答案】B

【解析】要使两行完全一致需要满足所有数字都不存在前导零(当然包含前导零,模998244353结果一直也可以,但是n很小,中间结果不会大于模数),也就是所有的1都在0前面,共11种情况。

单选

第25题

25. 当 n<=5 时,solve()的最大可能返回值为?()

A.65

B.211

C.665

D.2059

【答案】C

【解析】

图片

   

单选

第26题

26. 若 n=8,m=8,solve 和 solve2 的返回值的最大可能的差值为()

A.1477

B.1995

C.2059

D.2187

【答案】C

【解析】

图片

程序(3)

图片

图片

(3)题目的目的是在n个数字中取出两个数,使得它们数字差的绝对值小于等于m,至少要有k种方案,求m的最小值。代码采用二分法枚举差值m,然后把a数组排序之后使用尺取法求差值为m时有多少种方案。如果方案数>=k,那么可以尝试把差值变小;如果方案数<k,那么必须把差值变大。

判断

第27题

27.假设程序运行前能自动将 maxn改为 n+1,所实现的算法的时间复杂度是 O(nlogn)。( )

【答案】√

【解析】H结构体的所有运算都是O(1)的,因此时间复杂度主要是sort排序,为O(nlogn)。

判断

第28题

28. 时间开销的瓶颈是 init()函数( )

【答案】×

【解析】init函数是在使用筛法求质数,时间复杂度是O(N log log N),比sort排序快。

判断

第29题

29. 若修改常数 B1 或 K1 的值,该程序可能会输出不同呢的结果( )

【答案】√

【解析】输出的h1是由K1和B1共同作用求出来的,修改之后肯定会影响h1。

单选

第30题

30. 在 solve()函数种,h[]的合并顺序可以看作是:()

A. 二叉树的 BFS 序

B. 二叉树的先序遍历

C. 二叉树的中序遍历

D. 二叉树的后序遍历

【答案】C

【解析】观察第59行,可以看到h[i]是由左子树(2i)、根(i)、右子树(2i+1)的顺序组成的,即为二叉树的中序遍历。

单选

第31题

31. 输入“10”,输出的第一行是?()

A.83

B.424

C.54

D.110101000

【答案】A

【解析】p[i]表示i是否是质数,当i是质数时,点i的h1初始值为1,否则初值为0。考虑到p1[i]是B1的次方,也就是2的次方,可以发现h[i].h1是以i为根的子树的中序遍历二进制码,10个点的完全二叉树的中序遍历是“8 4 9 2 10 5 1 6 3 7”,代入初始值得到二进制“0001010011”,对应十进制的数字83。

单选

第32题

32. (4 分)输入“16”,输出的第二行是?()

A.7

B.9

C.10

D.12

【答案】C

【解析】此程序的功能是:质数点和合数点的权值不同,求n个点的完全二叉树有多少个hash值不同的子树。n=16时,树的形态如下:

图片

1个点的子树有2种:9,10,12,14,15,16和11,13;然后以1~8为根的子树各不相同,因此一共10种子树。

三、完善程序(单选题,每小题 3 分,共计 30 分)

程序(1)

(1)合并序列,有两个长度为 N 的单调不降序列 A 和 B,序列的每个元素都是小于 10^9的非负整数。在 A 和 B 中各取一个数相加可以得到 N^2 个和,求其中第 k 小的和。上述参数满足 N<=10^5 和 1<=K<=N^2

图片

图片

单选

第33题

33. (1)处应填()

A.an-a

B.an-a-1

C.ai

D.ai+1

【答案】A

【解析】发现l和r表示下标,因此答案只可能是 AB 之一,而 upper_bound 函数在参数ai大于等于[a, an] 中所有元素时需要返回 an。因此这里选择 A。

单选

第34题

34. (2)处应填()

A.a[mid]>ai

B.a[mid]>=ai

C.a[mid]<ai <="" p="">

D.a[mid]<=ai

【答案】A

【解析】upper_bound 用来求 [a,an]中第一个大于ai 的位置,因此这里选 A,如果a[mid]> ai 则更新右端点。

单选

第35题

35. (3)处应填()

A.a+l

B.a+l+1

C.a+l-1

D.an-l

【答案】A

【解析】二分到最后区间为[l,l],也就是第一个大于ai的位置为 a[l],注意这里需要返回地址,因此返回 a+l。

单选

第36题

36. (4)处应填()

A.a[n-1]+b[n-1]

B.a[n]+b[n]

C.2*maxn

D.maxn

【答案】A

【解析maxn 为数组大小,显然在这里不合适,数组下标为 a[0..n-1],因此可能的最大答案为 a[n- 1]+ b[n- 1]。

单选

第37题

37. (5)处应填()

A.get_rank(mid)<k <="" p="">

B.get_rank(mid)<=k

C.get_rank(mid)>k

D.get_rank(mid)>=k

【答案】A

【解析】第 36 行是将l更新为 mid +1 可知:当 if语句为 true 时,l到 mid 都不可能是答案,此时mid 的排名必然小于k,。

程序(2)

(2) (次短路)已知有一个 n 个点 m 条边的有向图 G,并且给定图中的两个点 s 和 t,求次短路(长度严格大于最短路的最短路径)。如果不存在,输出一行“-1”。如果存在,输出两行,第一行表示此段路经的长度,第二行表示此段路的一个方案

图片

图片

单选

第38题

38.(1)处应填()

A.udp(pre[b],n+b,dis[b],q)

B.upd(a,n+b,d,q)

C.upd(pre[b],b,dis[b],q)

D.upd(a,b,d,q)

【答案】A

【解析】如果b<n说明我们要用d更新b的最小值(在 24 行已经检验过d< dis[b]),那么b原来的最小值 dis[b] 就可能成为新的最小值,因此在这种情况下会尝试用 dis[b] 更新b的次小值,也就是 dis2[b] = dis[n+b ]。可以确定 upd的第二三个参数分别为n+b, dis[b]选择 A 选项。

单选

第39题

39.(2)处应填()

A.make_pair(-d,b)

B.make_pair(d,b)

C.make_pair(b,d)

D.make_pair(-b,d)

【答案】A

【解析】这里我们成功用 d更新了 dis[b],要将其放回优先队列,观察优先队列的定义,q是一个大根堆,而我们要的是最小值,所以这里传入时需要将取相反数,选 A。

单选

第40题

40.(3)处应填()

A.0xff

B.0x1f

C.0x3f

D.0x7f

【答案】B

【解析】观察最后判断无解的条件为 dis2[t]==inf,但是全篇除了这里和定义没有出现过inf,所以只有可能是利用 m&msek 将 dis 的初始值更新成了 inf。手算发现 inf 实际上等于0x1F1F1F1F.因此选择 B。

单选

第41题

41.(4)处应填()

A.upd(a,n+b,dis[a]+c,q)

B.upd(n+a,n+b,dis2[a]+c.q)

C.upd(n+a,b,dis2[a]+c,q)

D.upd(a,b,dis[a]+c,q)

【答案】A

【解析】aa<n 说明 dis[a]是最小值,而 48 行的条件告诉我们,尝试用 dis[a]+c去更新b的最小值失败了,此时应当尝试用 dis[a]+c去更新b的次小值,如果更新成功,则 dis2[b] 的前驱pre2[b] 应当为 a的最小值,也就是 a,选 A。

单选

第42题

42.(5)处应填()

A.pre2[a%n]

B.pre[a%n]

C.pre2[a]

D.pre[a%n]+1

【答案】A

【解析】由 59 行的条件可知,这里a≥n为a%n 的次小值,那么他的前驱为pre2[a%n]。选A。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值