2021CSP-J4

本文主要探讨了2021年CSP-J4级别的竞赛题目,分享了解题思路和关键点,对部分难题进行了分析。有兴趣获取答案的读者可以通过私信联系作者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021CSP-J4

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1.以下与电子邮件无关的网络协议是(   )
A.POP3		B. SMTP			C. FTP			D. MIME
2.二进制数11110110与00001111进行逻辑异或运算的结果是十进制数(   )
A. 6					B. 9			C. 249			D. 255
3.布尔型变量占用(    )个比特位
A. 2				B. 4				C. 8				D. 1
4.以下程序段执行完毕后,i和s的值分别是(   )
1.int i,s=0;
2.for(i=1;i<=5;i=i+2)
3.    s=s+i;
A. 5和9			B. 5和7			C. 9和7			D. 7和9
5.已知有序表{13,18,24,35,47,50,62,83,90,115,134),当折半查找值为90的元素时,查找成功的比较次数为(   )
A. 3				B. 5				C. 2				D. 4
6.数组不具有的特点是(   )
A.插入、删除不需要移动元素
B.所需空间与线性长度成正比
C.是一块连续的内存空间
D.可随机访问任一元素
7.用冒泡排序的方法对一个长度为n的数据进行排序,平均时间复杂度为(   )
A. O(n)			B. O(n \log{n})	C. O(n*n)		D. o(n \sqrt{n})
8.由4个节点构成的形态不同的二叉树有(  )种
A. 16			B. 14			C. 10			D. 20
9.以下4个数中最大的素数是(   )
A. 89			B. 93 			C. 119			D. 91
10.45和30的最小公倍数是(   )
A. 180			B. 90			C. 30			D. 45
11.深度为k的二叉树上,最多含有(   )个节点
A. 2k			B. 2^{k-1}		C. 2^{k}-1		D. 2k-1
12.字符串“abcab”本质不同的子串(包含空串)个数(   )
A. 12			B. 14			C. 13			D. 15
13.十进制小数11.375对应的二进制数是(   )
A. 1101.101		B. 1011.01		C. 1011.011		D. 1101.011
14.一棵6节点二叉树的中序遍历为ABDGECF,先序遍历为DBACEGF,后续遍历为(   )
A. GBEACFD		B. DGBEFAC 	C. ABGEFCD		D. ABCDEFG
15.当价格不变时,集成电路上可容纳的元器件的数目,约每隔	18~24个月便会增加一倍,性能也将提升一倍。提出该规律的是(    )
A.图灵			B. 诺贝尔		C. 摩尔			D. 冯-诺伊曼

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 T,错误填F;除特殊说明外,判断题1.5分,选择题4分,共计40分)
1)
1.#include<iostream>
2.using namespace std;
3.int a,b,c;
4.int main()
5.{
6.    cin>>a>>b>>c;
7.    a=b-a;
8.    b=b-a;
9.    a=b+a;
10.    c=b-a;
11.    cout<<a<<" "<<b<<" "<<c;
12.    return 0;
13.}
16.若输入1 2 3,则输出 3 2 1。   
17.若输入 123456789012 2 3,将输出 2 123456789012 123456789010    
18.该程序中,头文件 #include<iostream> 可以改成 #include<cstdio>		
19.若输入10,20,30 (逗号隔开),符合程序的输入要求		
20.若输入10 20 30,输出(   )
A. 20 10 20 			B. 20 10 30			C. 20 10 -10 			D. 20 10 10
21.若将第10行的c=b-a改成c=b,则若输入3 6 9,输出(   )
A. 6 3 6				B. 3 6 3				C. 6 3 3				D. 6 3 9

2)
1.#include<cstdio>
2.bool pd(long long n)
3.{
4.    if (n==1)
5.        return false;
6.    for(long long i=2;i<n;i++)
7.        if (n%i==0) return false;
8.    return true;
9.}
10.int main()
11.{
12.    long long n,i,c=0;
13.    int INF=1<<30;
14.    scanf("%lld",&n);
15.    for(i=2;i<=INF;i++)
16.    {
17.        if(pd(i))
18.        {
19.            c++;
20.            if(c==n)
21.            {
22.                printf("%lld",i);
23.                return 0;
24.            }
25.        }
26.    }
27.    printf("\nover");
28.    return 0;
29.}
22.上述代码中,将第13行修改为INF=1<<40,输出结果一定不变    
23.将第23行修改为break或continue这两种情况后,相同的输入,这两种情况的输出结果一定相同。    
24.上述代码中,将第23行修改为break后,相同的输入,变量c在循环结束后的值和为修改为break前一定相同     
25.上述代码中,将第23行修改为break后,相同的输入,输出结果也一定相同    
26.当输入为:8  
输出为(   )
A. 23\nover			B. 19 回车 over		C. 17			D. 19
27.上述代码中,将第6行的i<n修改为(   )后功能不变,效率更高
A.i*i<n				B. i<n/3				C. i<n/2			D. i<n/4

3)
1.#include<bits/stdc++.h>
2.using namespace std;
3.int a[100][100];
4.int b[100][100];
5.int f(int m,int n){
6.    if (m<=0||n<=0)
7.        return 0;
8.    a[0][0]=b[0][0];
9.    for (int i=1;i<n;i++) a[0][i]=a[0][i-1]+b[0][i];
10.    for (int i=1;i<m;i++) a[i][0]=a[i-1][0]+b[i][0];
11.    for (int i=1;i<m;i++){
12.        for (int j=1;j<n;j++){
13.            a[i][j]=min(a[i-1][j],a[i][j-1])+b[i][j];
14.        }
15.    }
16.    return a[m-1][n-1];
17.}
18.int main(){
19.    int m,n;
20.    cin>>m>>n;
21.    for (int i=0;i<m;i++){
22.        for (int j=0;j<n;j++){
23.            cin>>b[i][j];
24.        }
25.    }
26.    cout<<f(m,n);
27.    return 0;
28.}
28.上述代码实现了对一个长度为m*n的二维数组寻找每行上的最小值进行求和。     
29.上述代码如果删除第4行,其他地方的b数组都改成a数组,结果不变。      
30.若输入数据为:
1.4 4
2.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
则输出的结果为(   )
A. 46			B. 16			C. 28			D. 136
31.上述代码的时间复杂度为(   ) 
A. O(m*n+m*n)	B. O(min(m,n))	C. O(m*n)		D. O(m*n+m*n+m+n)
32.我们将上述算法称为(    )
A.贪心			B. 深度搜索		C. 广度搜索		D. 动态规划	
33.上述代码如果删除第4行,其它地方的b数组都改成a数组,输入数据为:
1.3 3
2.1 2 3 4 5 6 7 8 9
则输出的结果为(   )
A. 11			B. 20			C. 21			D. 12

三、完善程序(每小题3分,共计30分)
1)
请完善下面的程序,将1~9个数字分别填入3*3的九宫格中,第一行的三个数字组成一个三位数。要使第二行的三位数使第一行的2倍,第三行的三位数是第一行的3倍,且每个格子里的数字都不能重复,现在要求输出的所有填充方案,以每种方案中的第一行组成的三位数升序输出。
输出格式:
每一种方按输出共三行,每行中每两个数没有空格,每种方案输出后要输出一个空行。
最后一行一个数字,表示方案的总数。
1.#include<bits/stdc++.h>
2.using namespace std;
3.#define n 9
4.int a[10],b[10],t1,t2,t3,c;
5.void f(int s){
6.    int i;
7.    if( ① ){
8.        t1=a[1]*100+a[2]*10+a[3];
9.        t2=a[4]*100+a[5]*10+a[6];
10.        t3=a[7]*100+a[8]*10+a[9];
11.        if( ② ){
12.            cout<<t1<<endl<<t2<<endl<<t3<<endl<<ebdl;
13.            c++;
14.        }
15.        return;
16.    }
17.    for(i=1;i<=n;i++){
18.        if(b[i]==0){
19.            ③
20.            b[i]=1;
21.            ④
22.            ⑤
23.        }
24.    }
25.}
26.
27.int main()
28.{
29.    f(1);
30.    cout<<c<<endl;
31.}
34.①处应填(   )
A. s==n+1		B. s==n;			C. s<n			D. s>=n
35.②处应填(   )
A.t3*2==t2&&t3*3==t1
B.t1*3==t2&&t1*2==t3
C.t1*2==t2&&t2*3==t3
D.t1*2==t2&&t1*3==t3
36.③处应填(   )
A. a[i]=s;b[c]=i;	B. b[s]=i;			C. a[c]=i;			D. a[s]=i;
37.④处应填(   )
A. f(c+i+1);		B. f(i+1);			C. f(s+1);		D. f(c+1);
38.⑤处应填(   )
A. f(s-1);			B. s[s]=i;			C. b[i]=0;		D. s[s]=0;

2)
拓扑排序:输入一张n节点m条边的有向图,用求该图的一个拓扑排序的方式判断改图是否存在有向环,若有拓扑排序输出拓扑排序,并输出“不存在有向环”,否则直接输出“存在有向环”。
输入:
第一行两个正整数n,m表示节点数和边数。
接下来m行,每行2个正整数x,y表示节点x→y之间有一条边。
输出:
一个拓扑序:按拓扑序输出点的编号。若拓扑序不唯一,输出任一一个均可。并输出“不存在有向环”。若无拓扑序,直接输出“不存在有向环”。
1.#include<iostream>
2.#include<algorithm>
3.#include<vector>
4.#include<stack>
5.#define N 1001
6.using namespace std;
7.int n,m,x,y;
8.vector<int>G[N];
9.stack<int>q;
10.int cnt[N],tpc;
11.bool pd()
12.{
13.    for(int i=1;i<=n;i++)
14.        if( ① ) q.push(i);
15.    while(!q.empty())
16.    {
17.        int u=q.top();
18.        q.pop();
19.        tpc++;
20.        cout<<u<<" ";
21.        for (int i=0;i<G[u].size();i++)
22.        {
23.            int v=G[u][i];
24.            ②
25.            if(!cnt[v]) ③
26.        }
27.    }
28.    if( ④ ) return 1;
29.    else return 0;
30.}
31.int main()
32.{
33.    cin>>n>>m;
34.    while(m--)
35.    {
36.        cin>>x>>y;
37.        G[x].push_back(y);
38.        ⑤
39.    }
40.    if(pd()) cout<<"存在有向环";
41.    else cout<<"不存在有向环";
42.}
39.①处应填(   )
A. cnt[i]			B. !cnt[i]			C. cnt[i]=0			D. cnt[i]==1
40.②处应填(   )
A. q.pop();		B. q.push(v);		C. cnt[v]--;			D. cnt[u]--;
41.③处应填(   )
A. tpc++;		B. q.push(v);		C. q.pop();			D. tpc--;
42.④处应填(   )
A. tpc!=n		B. tpc==n		C. tpc!=0			D. tpc==0
43.⑤处应填(   )
A. cnt[y]++;		B. G[y].push(x)	C. G[y].push_back(x)	D. cnt[x]++;

 

要答案的私聊我^_^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值