本次比赛题目为2019CSP认证J组原题,去年浙江J组入围线80分,共1146名,有效参加共5848人。
一、单项选择
1. 答案:A
解析:.cn是中国的顶级域名,属于基本常识。
2. 答案:D
解析:逻辑与同时为1即为1,答案为D。
3. 答案:C
解析:1字节是8位,32位即4字节,int类型就是32位有符号整数。
4. 答案:A
解析:程序执行c次,每次-1,为a-c
5. 答案:A
解析:第一次(1+100)/2 = 50,第二次(1+50)/2 = 25, 第三次(1+25)/2 = 13, 第四次(1+13)/2 = 7, 第五次(1+7)/2= 4, 第六次(1+4)/2 = 2, 第七次(1+2)/2 = 1。
每次 / 2相当于 * 2,2^ 7是128,所以可以直接得到。
6. 答案:D
解析:链表没有下标,不可以随便访问,其他特点均有。
7. 答案:C
解析:也就是8拆成至多5个数之和(不计顺序),可按袋子个数分类讨论:1个袋子1种,2个袋子4种,3个袋子5种,4个袋子5种,5个袋子3种,共18种。
8. 答案:C
解析:最大值是最深的那层最靠右侧的节点,编号为((1 * 2 + 1) * 2 + 1) * 2 + 1=15
9. 答案:B
解析:97没有除了1和它本身的因子。
10. 答案:C
解析:可以用辗转相除法进行求解,最大公约数为:(319,377)=(319,58)=(58,29)=29
11. 答案:C
解析:设方案1,2各x,y天,由题意,3 * x +5 * y <= 21,x + y <= 7,y <=3. 求300i+600j的最大值。枚举所有情况,当i=2, j=3时,最大值2400。也可以使用线性规划,这个题目稍微难一些。
12. 答案:A
解析:鸽巢(抽屉)原理,13张牌最坏情况就是4种花色分別为3,3,3,4张,至少4张一个样花色。
13. 答案:C
解析:前两位有5种选法,分别是(0,1,6,8,9);第3位有3种,分别是(0,1,8);第4, 5位由前2位决定,答案为5 * 5 * 3 * 1 * 1=75
14. 答案:B
解析:要根据后续和中序求出这个棵树,后序是“左右根”,中序是“左根右”,中序中DBGEHJ是左子树,CIF是右子树,不断递归下去。
再看右子树的后序遍历为IFC,可以确定C为右子树的根结点;再加上中序为CIF,说明C无左子树,只有右子树。
而左子树的后序遍历为DGJHEB,因此B为左子树的根结点,再结合中序遍历,可以得知B的左子树只有D,GEHJ都是右子树。
GEHJ子树的后序遍历是GJHE,说明E是根,HJ为E的右子树,G是E的左子树。最后可知H为HJ子树的根,J为右子树。
通过以上分析,可以绘制出这棵树,如图所示。
再前序遍历可以得到ABDEGHJCFI。这个题目稍微难一些。
15. 答案:A
解析:鲁班奖是国内建设工程;诺贝尔奖为物理、化学、医学、文学、和平;普利策奖是新闻奖,图灵奖由美国计算机协会(ACM)于1966年设立,专门奖励那些对计算机事业作出重要贡献的个人。
二、阅读程序
16. 这段代码是将字符串下标是n的约数位置的小写字母转大写。
1)答案:错
解析:输入的字符串也可以包含数字以及其他字符。
2)答案:对
解析:除数不能为0,%0会发生Runtime Error(DIVIDE_BY_ZERO) //除零。
3)答案:错
解析:循环条件为<=n, 也就是n也会执行到。同时 n%n==0恒为True,所以修改后少了n这次循环,也就会改变结果了。
4)答案:对
解析:因为大写的ASCII值比较小,也就是从c>=a恒为False,所以s的值不会改变。
5)答案:B
解析:18=2 * 3 ^ 2, 根据欧拉函数,因数个数为 (1+1) * (1+2)=6。也就是判定条件最多满足6次,所以最多有6 个
6)答案:B
解析:100000 = 2 ^ 5 * 5 ^ 5, 根据欧拉函数,因数个数为 (5 + 1) * (5 + 1) = 36,也即是判定条件最多满足36次。
17.这是一个将a数组和b数组进行连接的代码,如果两个已经连接,会断开存储小的。
1)答案:对
解析:由限定条件可知,0<x,y<= n, 当m大于0时,一定存在某个数被选中,使得 ans<2*n。
2)答案:错
解析:数对是一个左值与一个右值相匹配,所以ans最终一定是偶数,但是第27行的”++ans“在23行循环内部,其中间结果可能是负数。
3)答案:错
解析:当m为1,并且输入x=1,y=1的时候,可以使得a[1]和b[1]同时为1。
4)答案:错
解析:当m为2, 并且输入x=1,y=2.x=1,y=3的时候
5)答案:A
解析:如果各不相同的话,m次循环,会导致2m个位置从0变到整数,答案为2n-2m
6)答案:A
解析:m个都不相同的话14行和16行不会执行,y都相同的话b[y]中会保留最小的一个x,所以只存了一组值,空着2n-2
18.构造数列a的笛卡尔树(根节点最小且保持中序遍历),并求节点深度与b的加权和
1)答案:错
解析:每次找a数组中第一次出现的最小值,即使有重复的数不会导致程序出错
2)答案:对
解析:因为递归最底层l>r返回0,而倒数第二层返回值是0+0+depth*b[mink],如果b是0的话也是0,以此类推,返回结果总是0
3)答案:A
解析:最坏情况下a有序,mink每次都切在一段,递归进行100层,执行次数为100+99+, +…1约等于5000。
4)答案:D
解析:最好情况下,每次都均分,每层递归总次数为 100,层数为logn约等于6,总次数月6 * 100=600。
5)答案:D
解析:n=10时,深度最大能够达到10,最大输出为1 * b[0]+2 * b[1]+...+10 * b[9]=1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5 + 6 * 6 + 7 * 7 + 8 * 8 + 9 * 9 + 10 * 10 = 385
6)答案:B
解析:b=1,即求一个100节点的二叉树,节点深度之和最小。可以使用贪心,100节点的完全二叉树最小。1 * 1+2 * 2+4 *3 +8 * 4+16 * 5+32 * 6+37 * 7=580
这个题目比较难
三、完善程序
19.递归是非常容易考察的一个算法,递归和分治思想联系紧密,我们往往会用递归去实现分治,比如汉诺塔。
1)答案:C
解析:递归边界,res只有这一处赋值,BD显然错。n%2的话01只跟n有关,错,因此只有t是对的
2)答案:D
解析:坐上角坐标。分别是左上,左下,右上,右下四个子矩阵。
3)答案:B
解析:右下角坐标。
4)答案:B
解析:由数字 0 变化来的矩阵,因此递归函数的初始参数为 n, 0
5)答案:B
解析:size也就矩阵的边长,为2的n次方,用位运算也就是1<<n
20.本题是经典排序算法的考察,对于不熟悉计数排序算法的同学来说有难度,这种排序题目自己可以用模拟法。把数据带进去算一下看看这个算法是怎么运行的。
1)答案:B
解析:此处是对第二关键字进行计数排序。题目中给出提示,先按第二关键字排序。并且根据填空2对ord进行更改,可知此时是対第二关键字进行排序。
2)答案:D
解析:cnt[b[i]]表示按第二关键字,第i个数排第几位。ord[i]表示第i小的数在原序列的位置
3)答案:C
解析:对第一关键字计数,并做各关键词的数量统计工作,因此将a[i]对应的元素数量自增一。
4)答案:A
解析:对应填空② ord[i]记录了第二关键字第i小的数在原序列的位置。此时res[i]记录了第一关键字第i小的数在原序列的位置。
5)答案:B
解析:此处是按顺序输出排序结果,由于之前已经按照第二、第一关键字进行计数排序,所以此时第i 个元素的原始下标为 res[i]。