CSP 2023 提高级第一轮 CSP-S 2023初试题 基础部分解析

目录

第 1 题

第 2 题

第 3 题

第 4 题

第 5 题

第 6 题

第 7 题

第 8 题

第 9 题

第 10 题

第 11 题

第 12 题

第 13 题

第 14 题

第 15 题


一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)

第 1 题

在 Linux 系统终端中,以下哪个命令用于创建一个新的目录?(B)

A. newdir

B. mkdir

C. create

D. mkfold

【Linux中创建新的目录的命令为mkdir】

第 2 题

0,1,2,3,4 中选取 44 个数字,能组成()个不同四位数(注:最小的四位数是 1000 最大的四位数是 9999)。(A)

A. 96

B. 18

C. 120

D. 84

【第一位不能填0,所以为4*4*3*2】

第 3 题

假设 n 是图的顶点的个数,m 是图的边的个数,为求解某一问题有下面四种不同时间复杂度的算法。对于 m=Θ(n) 的稀疏图而言,下面的四个选项,哪一项的渐近时间复杂度最小(A)。

A. O(m*sqrt(log⁡n)*log⁡log⁡n)

B. O(n^2+m)

C. O(n^2/log⁡m+mlog⁡n)

D. O(m+nlog⁡n)

【本题题意大致为当n == m时,那个时间复杂度最小】

【首先拿C,D比较,由于n == m,C就是O(n^2/logn+nlogn),D就是O(n+nlogn),它们都有nlogn,所以用剩下的比较,n^2/logn>n(应为本来n^2 / n才==n,结果现在除以小了,结果就大了,所以排除C。】

【接着排除B,B和D比较是我们发现它们都有m,剩下拿n^2和nlogn比较,D更小,B排除】

【最后D和A比较,A中的m可以看作n,sqrt(logn)*loglogn一定比logn小,再乘上一个n或m一定比nlogn小,D还要在这基础上加上n,那自然答案为A了

第 4 题

假设有 n 根柱子,需要按照以下规则依次放置编号为 1,2,3,⋯ 的圆环:每根柱子的底 部固定,顶部可以放入圆环;每次从柱子顶部放入圆环时,需要保证任何两个相邻圆环的编号之和是一个完全平方数。请计算当有 4 根柱子时,最多可以放置()个圆环

A. 7

B. 9

C. 11

D. 5

【注意:本题说的是同一个柱子上相邻两个圆环之和为完全平方数,而不是相邻两个柱子的和!!!(本人已踩坑)本题以9,16作为关键数

第 5 题

以下对数据结构的表述不恰当的一项是:(B)

A. 队列是一种先进先出(FIFO)的线性结构

B. 哈夫曼树的构造过程主要是为了实现图的深度优先搜索

C. 散列表是一种通过散列函数将关键字映射到存储位置的数据结构

D. 二叉树是一种每个结点最多有两个子结点的树结构

【哈夫曼树跟DFS没有关联。构造哈夫曼树是一个贪心的过程,可以用来编码压缩】

第 6 题

以下连通无向图中,(A)一定可以用不超过两种颜色进行染色

A. 完全三叉树

B. 平面图

C. 边双连通图

D. 欧拉图

 【完全三叉树染色只需每一层颜色不同】

第 7 题

最长公共子序列长度常常用来衡量两个序列的相似度。其定义如下:给定两个序列 X=x1,x2,x3,⋯,xm 和 Y=y1,y2,y3,⋯,yn,最长公共子序列(LCS)问题的目标是找到一个最长的新序列 Z=z1,z2,z3,⋯,zk​, 使得序列 Z 既是序列 X 的子序列,又是序列 Y 的子序列,且序列 Z 的长度 k 在满足上述条件的序列里是最大的。 (注:序列 A 是序列 B 的子序列,当且仅当在保持序列 B 元素顺序的情况下,从序列 B 中删除若干个元素,可以使得剩余的元素构成序列 A。)则序列 ABCAAAABA 和 ABABCBABA 的最长公共子序列长度为()

A. 4

B. 5
C. 6
D. 7

【最长公共子序列:ABAABA】

第 8 题

一位玩家正在玩一个特殊的掷骰子的游戏,游戏要求连续掷两次骰子,收益规则如下:玩家第一次掷出 x 点,得到 2x 元;第二次掷出 y 点,当 y=x 时玩家会失去之前得到的 2x 元而当 y≠x 时玩家能保住第一次获得的 2x 元。上述 x,y∈1,2,3,4,5,6。 例如:玩家第一次掷出 3 点得到 6 元后,但第二次再次掷出 3 点,会失去之前得到的 6 元,玩家最终收益为 0 元;如果玩家第一次掷出 3 点、第二次掷出 4 点,则最终收益是 6 元。假设骰子掷出任意一点的概率均为 1/6,玩家连续掷两次般子后,所有可能情形下收益的平均值是多少?(B)

A. 7 元

B. 35 / 6​ 元
C. 16 / 3​ 元
D. 19 / 3​ 元

【这里提个醒:平均值的算法不一定是(a1+a2+...+an) / n,是x1/n*a1 + x2/n*a2 + ... + x3/n*an,此处x数组的含义是抽中xi的概率,在求普通n个数的平均值时,xi就是1/n,因为n中选中ai的概率只有1/n(假定不重复,如果多次ai出现y次,那么xi就是y/n,不懂评论留言)

那么本题里,第一次抽中x有1/6的可能,第二次不抽中x有5/6的可能(为什么不考虑抽中两次x?因为0*(1/6)等于0,加与不加都一样,它的意义就是把不抽中x的可能性缩小了)那么得到2x的奖励就有(1/6)*(5/6) = 5/36种可能,但是我们还没有乘上ai(ai为1*2, 2*2, ..., 6*2,因为抽中这些数的两倍的概率时一样的,所以可以直接套括号一起乘),答案为5*42/36 = 35/6】

第 9 题

假设我们有以下的 C++ 代码:

int a = 5, b = 3, c = 4;
bool res = a & b || c ^ b && a | c; 

请问,res 的值是什么?() 提示:在 C++ 中,逻辑运算的优先级从高到低依次为:逻辑非(!)、逻辑与(&&)、逻辑或(||)。位运算的优先级从高到低依次为:位非(~)、位与(&)、位异或(^)、位或(|)。同时,双目位运算的优先级高于双目逻辑运算;逻辑非与位非优先级相同,且高于所有双目运算符。

A. true

B. false

C. 1

D. 0

化为二进制计算,注意res时bool类型,除了输出和强制转型,其内容为true/false】

第 10 题

假设快速排序算法的输入是一个长度为n 的已排序数组,且该快速排序算法在分治过程总是选择第一个元素作为基准元素。以下哪个选项描述的是在这种情况下的快速排序行为?(C)

A. 快速排序对于此类输入的表现最好,因为数组已经排序。

B. 快速排序对于此类输入的时间复杂度是 Θ(nlog⁡n)。

C. 快速排序对于此类输入的时间复杂度是 Θ(n^2)。

D. 快速排序无法对此类数组进行排序,因为数组已经排序。

【在这种情况下,快排速度反而接近与n^2,具体请了解快速排序思路,此处不再讲解】

第 11 题

以下哪个命令,能将一个名为 main.cpp 的 C++ 源文件,编译并生成一个名为 main 的可执行文件?(A)

A. g++ -o main main.cpp

B. g++ -o main.cpp main

C. g++ main -o main.cpp

D. g++ main.cpp -o main.cpp

【记住即可】

第 12 题

在图论中,树的重心是树上的一个结点,以该结点为根时,使得其所有的子树中结点数最多的子树的结点数最少。一棵树可能有多个重心。请问下面哪种树一定只有一个重心?

A. 4 个结点的树

B. 6 个结点的树

C. 7 个结点的树

D. 8 个结点的树

【什么是树的重心?(简单来说,就是一个树(不一定数二叉树),可以拿不同的节点做根,但是其重心最多只有两个。比如说如下一棵树

它既可以用1做重心,也可以用2做重心;

而上图中的树却只能用3做重心,因为3的节点最多的子树是1,2,共有两个节点,比用别的节点做根的最多节点个数的子树的节点个数都少。

解释完题意后,给个规律:节点个数为偶数的树有两个重心。

或者理解直接构成一条链,偶数个节点一定有多个中心

第 13 题

如图是一张包含 66 个顶点的有向图,但顶点间不存在拓扑序。如果要删除其中一条边,使这 66 个顶点能进行拓扑排序,请问总共有多少条边可以作为候选的被删除边?(C)

A. 1

B. 2

C. 3

D. 4

【我们发现1, 3, 4三点存在环,只要将(1, 3)(3, 4)(4, 1)三条边的其中一条删除即可】

第 14 题

A. 10

B. 11
C. 12
D. 13

【f函数实在求十六进制下的各位数字之和(结果为十进制)要使其永远调用自身返回的是9,可以调用f(9)应为十六进制下9的各位数字之和是9,再反复调用还是9。但是题目要求是100(16) ~ 1A0(16)之间的数。

我们分情况考虑:也许它经过一次反复调用无法直接得到9,可能得到18,27,36......

1. 直接得到 9:108,117,126,135,144,153,162,171,180(9 个)

2. 得到 18 后再得到 9:189,198(2 个)

3. 得到 27 后在得到 9:(得不到,因为1A0,19F的各位数字之和都小于 27)

第 15 题

现在用如下代码来计算 x^n,其时间复杂度为(A)。

double quick_power(double x, unsigned n) {
    if (n == 0) return 1;
    if (n == 1) return x;
    return quick_power(x, n / 2)
        * quick_power(x, n / 2)
        * ((n & 1) ? x : 1);
}

A. O(n)

B. O(1)

C. O(logn)

D. O(nlogn)

【可以画一下递归的树型结构,我们发现是一颗满二叉树的结构,节点数为2^logn=n,这个写法跟正常的快速幂的不同之处在于quick_power调用了两次。

看不懂评论区见,大家一起解答,有问题请反应~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值