2020 CSP-J初赛试题全解析

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 79 浏览




2020 CSP-J入门级C++初赛试题全解析

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

1.在内存储器中每个存储单元都被赋予-一个唯一的序号,称为(B)。
A.下标B.地址C.序号D.编号
答案B  解析:内存按地址编址
2.编译器的主要功能是(
A)。
A.将源程序翻译成机器指令代码B.将一种高级语言翻译成另一一种高级语言
C.将源程序重新组合D.将低级语言翻译成高级语言
答案A: 解析:编译型:将源码直接转换为二进制代码,生成目标程序,然后将目标程序连接成可执行的程序。流程为:高级语言源码—编译—>目标程序—连接—>可执行程序。
3.设x=true,y=true,z=false,以下逻辑运算表达式值为真的是(
C)。
A.(x∧y)∧zB.x∧(z∨y)∧zC)(x∧y)∨(z∨x)D.(y∨z)∧x∧z
答案:C解析:与:∧and&&    或:∨or||   非:¬!NOT  异或:^  优先级:括号>非>与>异或,或

4.现有一-张分辨率为2048x1024像素的32位真彩色图像。请问要存储这张图像,需要多大的存储空间?(B)。
A.4MB  B.8MB  C.32MB   D.16MB
答案:B解析:1位为1bit,1byte=8bit,2048*1024*32/8=8*(1024/1024)=8MB

5.冒泡排序算法的伪代码如下:
输入:数组L,n≥1。
输出:按非递减顺序排序的L。
算法BubbleSort:
1.FLAG←n//标记被交换的最后元素位置
2.whileFLAG>1do
3k←FLAG-1
4FLAG←1
5forj=1tokdo
6ifL(j)>L(j+1)thendo
7.L(j)<->L(j+1)
8.FLAG←j
对n个数用以上冒泡排序算法进行排序,最少需要比较多少次?(
D)。
A.n    B.n-2    C.n
2    D.n-1
答案:D解析:最少的比较次数就是数组本身已经有序,只需要比较n-1次;最多的比较次数是n*(n-1)/2;

6.设A是n个实数的数组,考虑下面的递归算法:
XYZ(A[1..n])
1.if  n=1thenreturnA[1]
2.else temp←XYZ(A[1..n-1])
3.if temp<a[n]
4.then returntemp
5 else returnA[n]
请问算法XYZ的输出是什么?(</a[n]
B)。
A.A数组的平均       B.A数组的最小值

C.A数组的最大值.    D.A数组的中值

答案:B 代码解析如下,分析代码可知,题目是求n个数的最小数:

int XYZ(int a[],int n)

{

    if(n==1)

        return a[1];

    else

    {

        int temp=XYZ(a,n-1);

        return min(temp,a[n]);

    }

}

7.链表不具有的特点是(B)。
A.插入删除不需要移动元素     B.可随机访问任一元素
C.不必事先估计存储空间       D.所需空间与线性表长度成正比
答案:B解析:可随机访问任一元素是线性表的特点。
8.有10个顶点的无向图至少应该有(
C)条边才能确保是一个连通图。
A.10  B.12   C.9  D.11
答案:C 解析:n个顶点的无向图,至少需要n-1条边,才能构成连通图。

9.二进制数1011转换成十进制数是(C)。
A.10  B.13  C.11  D.12
答案:C  解析:1+2+8=11

10.五个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求这两个双胞胎必须相邻,则有(48)种不同排列方法?
A.24   B.36    C.72     D.48
答案:D解析:捆绑法求解:两个双胞胎是一个单位,所以方案就是4的全排列4!==24,然后双胞胎自已的全排列是2,得数是24*2==48
11.下图中所使用的数据结构是(C)。
图片
A.哈希表    B.二叉树   
C.栈   D.队列
答案:C解析:简单数据结构常识题,典型的栈结构,先进后出
12.独根树的高度为1。具有61个结点的完全二叉树的高度为
(D)
A.7     B.5      C.8         D.6
答案:D解析:完全二叉树的性质:满二叉树是(2^高度-1),数一数也可以知道了,floor(log2n)+1=6
13.干支纪年法是中国传统的纪年方法,由10个天干和12个地支组合成60个
天干地支。由公历年份可以根据以下公式和表格换算出对应的天干地支。
天干=(公历年份)除以10所得余数
图片

例如,今年是2020年,2020除以10余数为0,查表为“庚";2020除以12,余数为4,查表为“子”,所以今年是庚子年。
请问1949年的天干地支是(
B)
A.己亥B.己丑C.己卯D.己酉
答案:B解析:1949=9,因此是已 1949=5,因此是丑


14.10个三好学生名额分配到7个班级,每个班级至少有一个名额,一共有(
B)种不同的分配方案。
A.56   B.84   C.72   D.504
答案:B解析:指“10个三好学生不加区分,分配进7个不同班级”,这样就是插板法组合数C96=84

15.有五副不同颜色的手套(共10只手套,每副手套左右手各1只),一次性从中取6只手套,请问恰好能配成两副手套的不同取法有(
D)种。
A.30  B.150  C.180  D.120

答案:D 解析:先从五双手套中取完整的两双,方案是组合数C(5,2)==10;
然后,从剩下的三双中,取不同色的两只手段,是先从三双中取两双C(3,2)==3
然后,再从两双中各取一,是C(2,1)*C(2,1)==4;
乘法原理,得数是10*3*4=120


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

图片

判断题
1)输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。
(true)答案:true 解析:因为数组大小为26,所以只能是大写字母,如果有小写字母会越界。

2)若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。

答案:false根据decoder字符串的值,如果输入是T~Z之间的字母,输出是一样的。
3)将第12行的“i<26”改为“i<16”,程序运行结果不会改变。
(true)
答案:true 解析:第12行是统计字符数,由于默认有3个字母,因此修改循环的值不影响统计结果。

4)将第26行的“i<26”改为“i<16”,程序运行结果不会改变。(false)
答案:false解析:这个程序通过encoder,decoder两次转换产生一个乱序字符串,利用乱序字符串加密encoder="CSPABDEFGHIKLMNOQRTUVWXYZ"

decoder="DEAFGHIKLMNOPQCRSBTUVWXYZ"


单选题
5)若输出的字符串为“ABCABCABCA",则下列说法正确的是
(C)。
A.输入的字符串中既有A又有P    B.输入的字符串中既有S又有B
C.输入的字符串中既有S又有P    D.输入的字符串中既有A又有B
答案:C 解析:输出中有ABC,对应decoder[2]、decoder[18]、decoder[15],则输入的字符分别为字符CSP。

6)若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是(D)
A.输入的字符串中既有J又有RB.输入的字符串中既有P又有K
C.输入的字符串中既有J又有KD.输入的字符串中既有P又有R
答案:D 解析:输出中有ABC,对应decoder[15]、decoder[17]、decoder[13],则输入的字符分别为字符PRN。

图片

假设输入的n是不超过2^62的正整数,k都是不超过10000的正整数,完成下面的判断题和单选题:
判断题
1)若k=1,则输出ans时,len=n。
(false)

答案:false 解析:当k为1时,n为1,1进制的1,len为2,所以错误。
2)若k>1,则输出ans时,len一定小于n。(false)

答案:false  解析:输入n为1且k>1时,ans=n
3)若k>1,则输出ans时,k^len一定大于n。(true)
代码的作用是十进制的n转换成k进制的数字,输出的ans为进位的次数,len为结果的长度。

答案:true 解析:n转化为len位的k进制数字值最大值为k^len-1,因此k^len>n。

单选题
4)若输入的n等于10^15,输入的k为1,则输出等于
(D)
A.(10^30-10^15)/2   B.(10^30+10^15)/2  C.1    D.10^15
答案:D 解析:当输入的k为1时,会直接进位,len为2,但是后面触发不了len++的条件,结果就是,len一直是2,每次d[0]++都会进位,输出ans=n

5)若输入的n等于205,891,132,094,649(即3^30),输入的k为3,则输出等于(A)。
A.(3^30-1)/2   B.3^30   C.3^30-1  D.(3^30+1)/2
答案:A

解析:

第1位,每k次运算进位1次;

第2位,每k2次运算进位1次;

……

因此第1位,会产生3^30/3次进位,第2位会产生3^30/3^2次进位……最后一位,会产生1次进位。

因此答案=3^30/3+3^30/3^2+…+1

根据等比数列求和公式Sn=(3^30–1)/(3-1)


6)若输入的n等于100,010,002,000,090,输入的k为10,则输出等于
(D)
A.11,112,222,444,543B.11,122,222,444,453
C.11,122,222,444,543D.11,112,222,444,453
答案:D

解析:

同上一问:

第1位进位次数=100010002000090/10次

第2位进位次数=100010002000090/100次

最后一位进位次数=1次

对上述数值求和可得D


图片

程序解析:每次将前两项合并,并清除一项,累计计算:a+x+abs(b-y)的和。

假设输入的n是不超过50的正整数,d[i][0]、d[i][1]都是不超过
10000的正整数,完成下面的判断题和单选题:
判断题
1)若输入n为0,此程序可能会死循环或发生运行错误。
(false)

答案:法false 解析:输入n为0,什么都没做,结束程序。
2)若输入n为20,接下来的输入全为0,则输出为0。(true)

答案:true 解析:全是0,运算过程中所有s都是0,ans也是0
3)输出的数一定不小于输入的d[i][0]和d[i][1]的任意一个。(false)

答案:false 解析:这里减法,所以ans可能小于输入的d[i][1],例如输入:00和55  输为0

单选题
4)若输入的n为20,接下来的输入是20个9和20个0,则输出为
(C)。
A.1917B.1908C.1881D.1890
答案:C 解析:第二列为0,可以忽略。第1次合并:9+9=9*2第2次合并:18+9=9*3第3次合并:27+9=9*4 …第19次合并:9*29 因此和=9*2+9*3+…+9*20=1881

5)若输入的n为30,接下来的输入是30个0和30个5,则输出为(B)。
A.2020B.2030C.2010D.2000
答案:B 解析:第1次合并:5-5=0 第2次合并:5+5-5=5=5*1 第3次合并:10+5-5=10=5*2

… 第29次合并:5*30-5=5*28 求和=5*(1+2+…+28)=2030

6)(4分)若输入的n为15,接下来的输入是15到1,以及15到1,则输出为(D)。
A.2420   B.2220  C.2440  D.2240
答案 :D 解析:对于第1列:第1次合并=15+14第2次合并=15+14+13…第14次合并=15+14+13+12+…+1  15*14+14*14+13*13+…+1*1=1225 对于第2列:第1次合并=15-14 第2次合并=15+14-13 第3次合并=15+14+13-12……第14次合并=15+14+13+12+…+2-1 15*13+14*12+…+3*1=1001,这里加上14个1  最终答案是:2240

三、完善程序(单选题,每小题3分,共计30分)
1.
(质因数分解)给出正整数n,请输出将n质因数分解的结果,结果从小
到大输出。
例如:输入n=120,程序应该输出22235,表示120=2*2*2*3*5。输入保证2≤n≤10^9。
提示:先从小到大枚举变量i,然后用i不停试除n来寻找所有的质因子。
试补全程序。

图片
1)处应填(D)
A.n-1   B.0  C.1  
D.2

答案:D解析:因子最小为2,所以选i=2

2)处应填(D)
A.n/
I  B.n/(i*i)   C.i*i*I  D.i*i

答案:D 解析:因子最大为根号n所以选i*i

3)处应填(D)
A.if(i*i<=n) B.if(n%i==0)  C.while(i*i<=n) 
D.while(n%i==0)

答案:D解析:由题目可知,一个因子可能被分解出好多次

4)处应填(A)
A.n>1   B.n<=1   C.i+i<=n   D.i<n i<="" span="">

答案:A解析:分解完成后,n的值为1或者质数,判断剩余的是不是质数

5)处应填(D)
A.2   B.i  C.n/
I  D.n
答案:D 解析:不是1的话需要单独输出

2.(最小区间覆盖)给出n个区间,第i个区间的左右端点是[a_i,b_i]。现在要在这些区间中选出若干个,使得
区间[0,m]被所选区间的并覆盖(即每一个0≤i≤m都在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。
输入第一行包含两个整数n和m(1≤n≤5000,1≤m≤10°)。
接下来n行,每行两个整数ai,bi;(0≤ai,bi≤m)。
提示:使用贪心法解决这个问题。先用θ(n2)的时间复杂度排序,然后贪心选择这些区间。
试补全程序。
图片

1)处应填(C)
A.A[j].bA[j-1].b
C.A[j].aA[j-1].a

答案:C 解析:按照区间起点进行排序

2)处应填(C)
A.A[j-1]=A[j];A[j]=t;
B.A[j+1]=A[j];A[j]=t;
C.A[j]=A[j-1];A[j-1]=t;
D.A[j]=A[j+1];A[j+1]=t;
答案:C 解析:变量交换代码
3)处应填(C)
A.A[i].bA[i-1].b
C.A[i].b>A[p-1].bD.A[i].b<a[i-1].b
</a[i-1].b
答案:C解析:筛掉起点靠后同时终点靠前的区间,因为这样的区间完整的被前面选中的区间包含了。

4)处应填(B)
A.q+1<n&&a[q+1].b<=r
B.q+1<n&&a[q+1].a<=r
C.q<n&&a[q].a<=r
D.q<n&&a[q].b<=r
</n&&a[q].b<=r
</n&&a[q].a<=r
</n&&a[q+1].a<=r
</n&&a[q+1].b<=r
答案:B解析:此时剩余的区间逐个选用,优先选用能和前一个区间连接的情况下,右端点更靠右的区间

5)处应填(B)
A.r=max(r,A[q+1].a)B.r=max(r,A[q].b)
C.r=max(r,A[q+1].b)D.q++

答案:B解析:更新r为当前选中区间的右端点的值



发布于 2024-03-30 09:56

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

All Rights Reserved Powered BY WeCenter V4.1.0 © 2026 京ICP备20005761号-2