CSP-J 2021 入门级 第一轮(初赛) 答案及解析

CSP-J 2021 入门级 第一轮(初赛) 答案及解析

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

  1. 以下不属于面向对象程序设计语言的是( )。
    A. C++
    B. Python
    C. Java
    D. C

正确答案: D
面向对象程序设计语言支持类的写法,可以在类内声明属性和方法。
C++、Python、Java都可以写类。C语言只能写结构体,内部不能写成员函数,不支持类的写法,因此C语言不是面向对象程序设计语言。选D。

  1. 以下奖项与计算机领域最相关的是( )。
    A. 奥斯卡奖
    B. 图灵奖
    C. 诺贝尔奖
    D. 普利策奖

正确答案: B
奥斯卡奖是影视行业的奖项。
诺贝尔奖包括物理,化学,生理学或医学,文学,和平,经济奖等奖项。
普利策奖是新闻行业的奖项。
图灵奖是计算机科学领域的国际最高奖项。选B。

  1. 目前主流的计算机储存数据最终都是转换成( )数据进行储存。
    A. 二进制
    B. 十进制
    C. 八进制
    D. 十六进制

正确答案: A
计算机内部寄存器、缓存、内存,以及外设硬盘、U盘等各种存储设备都是以二进制存储数据的。八进制与十六进制只是对二进制数的便于观看的表示方式,其本质都是二进制数。选A。

  1. 以比较作为基本运算,在N个数中找出最大数,最坏情况下所需要的最少的比较次数为 ( )。
    A. N 2 N^2 N2
    B. N N N
    C. N − 1 N-1 N1
    D. N + 1 N+1 N+1

正确答案: C
最坏情况下的最少比较次数,指的是采用最优算法的情况下,由于序列顺序不同而可能最终比较次数不同,求其中比较次数最多能达到多少。
求N个数的最大值,可以设一个mx变量,首先将第一个数赋值给mx变量。而后循环N-1次,每次用mx变量和序列中的一个数比较,如果序列中的数大于mx,mx就设为这个数。这就是基于比较求N个数中最大值的最优算法,最坏情况下每个数都要与mx比较,比较次数为N-1。

  1. 对于入栈顺序为a,b,c,d,e的序列,下列( )不是合法的出栈序列。
    A. a,b,c,d,e
    B. e,d,c,b,a
    C. b,a,c,d,e
    D. c,d,a,e,b

正确答案: D
A:每入栈一个元素后就出栈该元素,就能得到与入栈序列顺序相同的序列。
入栈a,出栈a,入栈b,出栈b,入栈c,出栈c,入栈d,出栈d,入栈e,出栈e。得到序列:a,b,c,d,e。
B:先将所有元素都入栈,而后依次出栈,就可以得到原序列的倒序序列。
将a、b、c、d、e按顺序分别入栈,而后依次出栈:出栈e,出栈d,出栈c,出栈b,出栈a。得到序列:e,d,c,b,a。
C:对于判断一个一般的序列是否可以是另一元素序列在入栈过程中出栈得到,判断规则为:
如果栈顶是需要出栈的元素,则出栈。否则元素入栈。
按照出栈序列顺序b,a,c,d,e,依次需要这些元素。入栈要按照a,b,c,d,e顺序依次入栈。
首先需要b,栈空,因此入栈a。
需要b,栈顶为a,入栈b。
需要b,栈顶为b,出栈b。
需要a,栈顶为a,出栈a。
需要c,栈空,入栈c。
需要c,栈顶为c,出栈c。
需要d,栈空,入栈d。
需要d,栈顶为d,出栈d。
需要e,栈空,入栈e。
需要e,栈顶为e,出栈e。
D:需要的出栈序列为c,d,a,e,b,入栈顺序为a,b,c,d,e。
需要c,栈空,入栈a。
需要c,栈顶为a,入栈b。
需要c,栈顶为b,入栈c。
需要c,栈顶为c,出栈c。
需要d,栈顶为b,入栈d。
需要d,栈顶为d,出栈d。
需要a,栈顶为b,入栈e。
需要a,栈顶为e,没有可以入栈的元素了。
因为需要的a现在被压在栈底,无法出栈。因此当入栈顺序为a,b,c,d,e时,无法得到出栈序列c,d,a,e,b。
选D。

  1. 对于有n个顶点、m条边的无向连通图(m>n),需要删掉( )条边才能使其成为一棵树。
    A. n−1
    B. m−n
    C. m−n−1
    D. m−n+1

正确答案: D
树的定义为:无向连通无环图。
树有n个顶点时,必定有n-1条边。一共有m条边,要剩下n-1条边,则需要删掉m-(n-1)=m-n+1条边,选D。

  1. 二进制数101.11对应的十进制数是( )。
    A. 6.5
    B. 5.5
    C. 5.75
    D. 5.25

正确答案: C
二进制数转为十进制数,方法为按位权展开。
小数点前一位为第0位,小数点后一位为第-1位。
第i位的位权为 2 i 2^i 2i,按位权展开为将数写成每位位权乘以该为数码后相加的形式。
( 101.11 ) 2 = 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 + 1 ∗ 2 − 1 + 1 ∗ 2 − 2 = 4 + 1 + 0.5 + 0.25 = 5.75 (101.11)_2=1*2^2+0*2^1+1*2^0+1*2^{-1}+1*2^{-2}=4+1+0.5+0.25=5.75 (101.11)2=122+021+120+121+122=4+1+0.5+0.25=5.75,选C。

  1. 如果一棵二叉树只有根结点,那么这棵二叉树高度为1。请问高度为5的完全二叉树有 ( )种不同的形态?
    A. 16
    B. 15
    C. 17
    D. 32

正确答案: A
高度为n的完全二叉树,前n-1层是满二叉树,第n层的结点连续集中在最左边。
高度为5的完全二叉树,前4层是满二叉树,第5层最少有1个结点。
根据二叉树第h层最大结点数量为 2 h − 1 2^{h-1} 2h1,因此第5层最多有 2 5 − 1 = 16 2^{5-1}=16 251=16个结点。
第5层可以有1个、2个、。。。、16个结点,共16种不同的形态。选A。

  1. 表达式 a*(b+c)*d 的后缀表达式为( ),其中 * 和 + 是运算符。
    A. * * a + b c d
    B. a b c + * d *
    C. a b c + d * *
    D. * a * + b c d

正确答案: B
中缀表达式转为后缀表达式:
将“表达式1 运算符 表达式2”变为“表达式1 表达式2 运算符”。对每个运算符,都进行此类改变。
第1步 b+c 变为 b c +
第2步 a*(b+c) 变为 a b c + *
第3步 a*(b+c)*d 变为 a b c + * d *。选B。

  1. 6 个人,两个人组一队,总共组成三队,不区分队伍的编号。不同的组队情况有( )种。
    A. 10
    B. 15
    C. 30
    D. 20

正确答案: B
假设各队伍是不同的。
第1步:在6人中选出2人放入第1队,方案数为 C ( 6 , 2 ) C(6,2) C(6,2)
第2步:在剩下的4人中选出2人放入第2队,方案数为 C ( 4 , 2 ) C(4,2) C(4,2)
第3步:在剩下的2人中选出2人放入第3队,方案数为 C ( 2 , 2 ) C(2,2) C(2,2)
设在各队伍相同的情况下,组队情况有 x x x种。从各队相同变为各队不同,总方案数为每种组队情况乘以3队的全排列 P ( 3 , 3 ) P(3,3) P(3,3)
因此分为3队各队不同总方案数为 x ⋅ P ( 3 , 3 ) = C ( 6 , 2 ) ⋅ C ( 4 , 2 ) ⋅ C ( 2 , 2 ) x\cdot P(3,3)=C(6,2)\cdot C(4,2)\cdot C(2,2) xP(3,3)=C(6,2)C(4,2)C(2,2)
因此分为3队各队相同的方案数为 x = C ( 6 , 2 ) ⋅ C ( 4 , 2 ) ⋅ C ( 2 , 2 ) P ( 3 , 3 ) = 6 ∗ 5 / 2 ∗ 4 ∗ 3 / 2 3 ∗ 2 = 15 x=\dfrac{C(6,2)\cdot C(4,2)\cdot C(2,2)}{P(3,3)}=\dfrac{6*5/2*4*3/2}{3*2}=15 x=P(3,3)C(6,2)C(4,2)C(2,2)=3265/243/2=15,选B。

  1. 在数据压缩编码中的哈夫曼编码方法,在本质上是一种( )的策略。
    A. 枚举
    B. 贪心
    C. 递归
    D. 动态规划

正确答案: B
已知各个字符出现的频率,构建哈夫曼树求哈夫曼编码。
首先将每个字符作为一个结点,字符出现的频率作为结点的权值,每个结点可以看作一棵树。
每次循环选择权值最小的两棵树,将两棵树作为一个新的结点的两棵子树,得到一棵新的树。新的树的权值为两棵子树权值的加和。最后根据哈夫曼树就可以得到哈夫曼编码。
这一过程中有“每次选择权值最小的两棵树”的过程,每次选择最大或最小,就是贪心算法的做法。
因此求哈夫曼编码的算法是贪心算法,选B。

  1. 1,1,2,2,3 这五个数字组成不同的三位数有( )种。
    A. 18
    B. 15
    C. 12
    D. 24

正确答案: A
分类讨论
第1类:AAB形式,三位数中两位相同,另一位与其它两位不同。
先确定用哪些数字:
先确定有两位相同的数,只能是1或2,有2种情况。
再确定另一个数,可以在剩下的两种数中选择,有2种情况。
再确定数字位置:
需要在3个位置中选择2个位置方两个相同的数,剩下的1个位置放剩下的数,有 C ( 3 , 2 ) C(3,2) C(3,2)种情况。
因此该情况的方案数为 2 ∗ 2 ∗ C ( 3 , 2 ) 2*2*C(3,2) 22C(3,2)
第2类:ABC形式,三位数每位各不相同,三位数就是1,2,3。
这三个不同的数字放在3个不同的位置,有 P ( 3 , 3 ) P(3,3) P(3,3)种情况。
因此在1,1,2,2,3这五个数字中选数组成不同的三位数有 2 ∗ 2 ∗ C ( 3 , 2 ) + P ( 3 , 3 ) = 4 ∗ 3 + 3 ∗ 2 = 18 2*2*C(3,2)+P(3,3)=4*3+3*2=18 22C(3,2)+P(3,3)=43+32=18种情况,选A。

solve(n)  
     if n<=1 return 1  
     else if n>=5 return n*solve(n-2)  
     else return n*solve(n-1)  

则调用 solve(7) 得到的返回结果为( )。
A. 105
B. 840
C. 210
D. 420

正确答案: C
此类问题建议使用“递归转地推”完成。
递归问题:求solve(n),将solve(n)的值作为数组第n项的值
递归出口:对应递推初始状态
递归关系:对应递推式
写出与本题功能相同的递推算法:

int a[10005];//a[i]即为solve(i)的值
a[1] = 1;
for(int i = 2; i <= n; ++i)
{
	if(i >= 5)
		a[i] = i*a[i-2];
	else
		a[i] = i*a[i-1];
}

根据此递推算法,递推求出a数组每一项的值,直到求出a[7]

a[1] = 1
a[2] = 2*a[1] = 2
a[3] = 3*a[2] = 3*2 = 6
a[4] = 4*a[3] = 4*6 = 24
a[5] = 5*a[3] = 5*6 = 30
a[6] = 6*a[4] = 6*24 = 144
a[7] = 7*a[5] = 7*30 = 210

因此本题选C。

  1. 以a为起点,对下边的无向图进行深度优先遍历,则b,c,d,e 四个点中有可能作为最后一个遍历到的点的个数为( )。
    在这里插入图片描述
    A. 1
    B. 2
    C. 3
    D. 4

正确答案: B
该图是无向图,从a出发进行深度优先遍历。深度优先遍历的顺序是:从当前结点出发访问未访问过的邻接点,如果邻接点都已访问过,则回退到上一个顶点。对该图进行深度优先遍历的顺序可能是:
1)a->b->d->c->e
2)a->c->d->b->回退到d->回退到c->e
3) a->c->e->回退到c->d->b
因此终点可能有2种,选择B。

  1. 有四个人要从 A 点坐一条船过河到 B 点,船一开始在 A 点。该船一次最多可坐两个人。 已知这四个人中每个人独自坐船的过河时间分别为1,2,4,8,且两个人坐船的过河时间为两人独自过河时间的较大者。则最短( )时间可以让四个人都过河到 B 点(包括从 B 点把船开回 A 点的时间)。

A. 14
B. 15
C. 16
D. 17

正确答案: B
贪心求小船过河问题,此类问题通用解法见ybt 1232:Crossing River
设a过河时间为1,b过河时间为2,c过河时间为4,d过河时间为8
方案1:只有a做船夫,带人过河,具体方案为:
a与b到右岸,耗时2。
a回到左岸,耗时1。
a与c到右岸,耗时4。
a回到左岸,耗时1。
a与d到右岸,耗时8。
总耗时:2+1+4+1+8=16。
方案2:a与b都作为船夫,让过河时间最慢的c与d同时过河,具体方案为:
a与b到右岸,耗时2。
a回到左岸,耗时1。
c与d到右岸,耗时8。
b回到左岸,耗时2。
a与b到右岸,耗时2。
总耗时:2+1+8+2+2=15。
方案2的过河时间更短,为15。因此选B。
【注意】方案2的过河时间不是必然比方案1更短,有时方案1的过河时间更短,比如当c的过河时间为2时,方案1更优。

二、阅读程序

阅读程序(1)
阅读程序(2)
阅读程序(3)

三、完善程序

完善程序(1)
完善程序(2)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值