CSP-S 2024 提高级 第一轮试题(初赛)答案及解析
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
1.在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?( )
A. pwd
B. cd
C. ls
D. echo
答:A
pwd (英文全拼:print work directory) 命令用于显示工作目录。
cd (英文全拼:change directory)命令用于改变当前工作目录的命令,切换到指
定的路径。
ls (英文全拼: list directory contents)命令用于显示指定工作目录下之内容
echo 通常用于 shell 脚本中,用于显示消息或输出其他命令的结果。
- 假设一个长度为 n 的整数数组中每个元素互不相同,且这个数组是无序的。要找到这个数组中最大元素的时间复杂度是多少?( )
A.O(n)
B.O(log n)
C.O(n log n)
D.O(1)
答:A
n个元素的序列找最大值,只能使用顺序查找的方法。先把第一个元素赋值给表示最大值的变量,而后每个元素都与表示最大值的变量比较,需要比较 n-1 次,时间复杂度为O(n)。
- 在 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
C选项baz函数内调用了baz函数,这是一个递归函数,并且没有写递归出口,会一直递归调用,不断占用栈区空间,直到发生栈溢出,产生运行时错误。
- 在一场比赛中,有 10 名选手参加,前三名将获得金银铜牌,若不允许并列,且每名选手只能获得一枚奖牌,则不同的颁奖方式共有多少种?( )
A.120
B.720
C.504
D.1000
答:B
从10人中选出3人作为获奖选手,获奖选手分别获得金银铜牌,是排列。颁奖方式为从10个不同元素中选出3个不同元素的排列数, P ( 10 , 3 ) = 10 ∗ 9 ∗ 8 = 720 P(10,3)=10*9*8=720 P(10,3)=10∗9∗8=720
- 下面哪个数据结构最适合实现先进先出(FIFO)的功能?( )
A.栈
B.队列
C.线性表
D.二叉搜索树
答:B
线性表可以进行各种添加、删除操作,功能比较复杂,并不是最适合实现先进先出的数据结构。
栈和队列是受限的线性表。
栈只能在一端添加或删除元素,元素后进先出。
队列可以在一端添加元素,另一端删除元素,元素先进先出。
二叉搜索树不是线性结构,可以完成数据的自动排序。
- 已知 f(1) = 1,且对于 n>=2 有
f
(
n
)
=
f
(
n
−
1
)
+
f
(
⌊
n
/
2
⌋
)
f(n)=f(n-1)+f(\lfloor n/2 \rfloor)
f(n)=f(n−1)+f(⌊n/2⌋),则 f(4)的值为:( )
A.4
B.5
C.6
D.7
答:B
递推求解
f(2)=f(1)+f(2/2)=f(1)+f(1)=2
f(3)=f(2)+f(3/2)=f(2)+f(1)=3
f(4)=f(3)+f(4/2)=f(3)+f(2)=5
- 假设一个包含 n 个顶点的无向图,且该图是欧拉图。以下关于该图的描述中哪一项不一定正确?( )
A.所有顶点的度数均为偶数
B.该图联通
C.该图存在一个欧拉回路
D.该图的边数是奇数
答:D
欧拉回路是通过图中所有边且每条边仅通过一次的回路。
欧拉图是指含有欧拉回路的无向连通图。
一个无向连通图是欧拉图的充分必要条件是:图中顶点都是偶数度顶点
A、B、C都正确。
当一个图有1,2,3,4四个顶点,有(1,2), (2,3), (3,4), (4,1)四条边时(设想一个正方形,四个角是四个顶点),该图有偶数条边,也是连通图,D是不一定正确的。
- 对数组进行二分查找的过程中,以下哪个条件必须满足?( )
A.数组必须是有序的
B.数组必须是无序的
C.数组长度必须是 2 的幂
D.数组中的元素必须是整数
答:A
二分查找的前提的序列有序
- 考虑一个自然数n以及一个模数m,你需要计算n的逆元(即n在模m意义下的乘法逆元)。下列哪种算法最为合适?( )
A.使用暴力方法依次尝试
B.使用扩展欧几里得解法
C.使用快速幂解法
D.使用线性筛法
答:B
n x ≡ 1 ( m o d m ) nx\equiv 1 (mod\ m) nx≡1(mod m)该同余方程的解为n在模m意义下的乘法逆元,记为 n − 1 m o d m n^{-1} mod\ m n−1mod m
当模数m为质数时,根据费马小定理 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1 (mod\ p) ap−1≡1(mod p)可知 n − 1 ≡ n m − 2 ( m o d m ) n^{-1}\equiv n^{m-2} (mod\ m) n−1≡nm−2(mod m),可以使用快速幂解法求逆元。
而当模数m不是质数时,就不能用快速幂来求逆元了,需要使用扩展欧几里得解法求逆元。
使用扩展欧几里得算法解线性同余方程 n x ≡ 1 ( m o d m ) nx\equiv 1 (mod\ m) nx≡1(mod m),相当于解不定方程 n x + m y = 1 nx+my=1 nx+my=1, n − 1 m o d m n^{-1} mod\ m n−1mod m存在的前提是n与m互质,所以 g c d ( n , m ) = 1 gcd(n, m)=1 gcd(n,m)=1
可以使用扩展欧几里得算法求不定方程 n x + m y = g c d ( n , m ) nx+my=gcd(n,m) nx+my=gcd(n,m)的解,其中x的一个解为 x 0 x_0 x0,那么 n − 1 ≡ x 0 ( m o d m ) n^{-1}\equiv x_0 (mod\ m) n−1≡x0(mod m)
- 在设计一个哈希表时,为了减少冲突,需要使用适当的哈希函数和冲突解决策略。已知某哈希表中有n个键值对,表的装载因子为 α(0<α<=1)。在使用开放地址法解决冲突的过程中,最坏情况下查找一个元素的时间复杂度为( )
A.O(1)
B.O(log n)
C.O(1/(1-α))
D.O(n)
答:D
哈希表为将数据通过哈希函数求出哈希值,将该数据保存在内存中该哈希值所对应的位置。如果该位置已经保存数据,则发生哈希冲突。
开放地址法解决冲突,即当发生哈希冲突时根据一定规则选择另一个未被占用的位置存放数据。
比如如果发生冲突,就不断增加地址编号,直到找到一个未被占用的位置。
装载因子为已经存储的数据数量与哈希表可以存储的最大数据数量的比值。
最坏情况下,如果这n个元素的哈希值相同,按照相同的解决冲突的方法存储在哈希表中。那么通过开放地址法去查找最后一个存入的元素时,需要n次探查,复杂度为O(n)
最好情况下,哈希值对应的位置没有数据,可以直接存储,复杂度为O(1)
平均情况下,查找一个元素的时间复杂度为O(1/(1-α))
- 假设有一颗 h 层的完全二叉树,该树最多包含多少个节点( )
A. 2 h − 1 2^h-1 2h−1
B. 2 h + 1 − 1 2^{h+1}-1 2h+1−1
C. 2 h 2^h 2h
D. 2 h + 1 2^{h+1} 2h+1
答:A
h层完全二叉树结点最多时是满二叉树,h层满二叉树有 2 h − 1 2^h-1 2h−1个结点
- 设有一个10个顶点的完全图,每两个顶点之间都有一条边,有多少个长度为4的环?( )
A.120
B.210
C.630
D.5040
答: C
一个长为4的环,由4个顶点构成。
从10个顶点中选出4个顶点,4个顶点可以构成3种环
1-2-3-4-1
1-3-2-4-1
1-3-4-2-1
总方案数为 C ( 10 , 4 ) ∗ 3 = 630 C(10,4)*3=630 C(10,4)∗3=630
- 对于一个整数n,定义f(n)为n的各位数字之和,问使 f(f(x))=10的最小自然数x是多少?( )
A.29
B.199
C.299
D.399
答:B
从小到大依次把各个选项代入f(f(x))
f(29)=11,f(f(29))=f(11)=2,结果不为10
f(199)=19,f(f(199))=f(19)=10,结果为10
后面数字即便满足f(f(x))=10,也都比199大。该题求的是满足条件的最小自然数,因此选B。
- 设有一个长度为n的01字符串,其中有k个1,每次操作可以交换相邻两个字符。在最坏的情况下将这 k个1移到字符串最右边所需要的交换次数是多少?( )
A.k
B.k*(k-1)/2
C.(n-k)*k
D.(2n-k-1)*k/2
答:C
每次交换相邻字符,将k个1移动到字符串右边。这是在对该字符序列进行冒泡排序,求冒泡排序中元素交换的次数。而冒泡排序中元素交换的次数,就是序列中逆序对的个数。(逆序对:前大后小的数对)
因此我们需要使长为n的有k个1的01字符串的逆序对最多,显然就是k个1在前,n-k个0在后。每个1都能和后面的n-k个0构成逆序对,共有k*(n-k)个逆序对。因此选C。
15.如图是一张包含7个顶点的有向图。如果要删除其中一些边,使得从节点1到节点7 没有可行路径,且删除的边数最少,请问总共有多少种可行的删除边的集合?( )
A.1
B.2
C.3
D.4
答:D
使从顶点1到顶点7没有路径,只删掉1条边很明显不行,比较明显的是可以删掉<5,7> <6,7>两条边,就可以从顶点1到顶点7没有路径。因此删掉的边数为2。
这里可以假想从顶点1是水源,边是单向管道,现在水可以从顶点1流到顶点7。要想阻断水流,需要移除一些管道。
从顶点1出发的水流,一个方向去了顶点2,另一个方向是顶点4。
删除<1,2>可以使不再有从顶点2出发的水流,要删掉一条边来阻断从4到7的水流,只能删除<4,6>
删除<2,5>也可以阻断从顶点2出发的水流,接下来还要删掉<4,6>
删除<5,7>阻断从顶点2出发的水流,再删除<4,6>也是可行的,也可以删掉<6,7>
所以删除边的方案有:
方案1:<1,2> <4,6>
方案2:<2,5> <4,6>
方案3:<5,7> <4,6>
方案4:<5,7> <6,7>