2021CSP-J1

本文详细解析了2021年CSP-J1竞赛的相关内容,包括题目难点、解题策略以及参赛者的表现分析。

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

2021CSP-J1

	 

2021CSP-J1

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1.以下哪项不属于国家顶级域名(    )
A. .au			B. .cn			C. .com			D. .jp
2.2个10进制数1111和1010的异或运算结果的10进制表示是(   )
A. 101			B. 3				C. 1957			D. 5
3.8位二进制数中去掉符号位,最多能表示多少个字符(	 )
A. 127			B. 128			C. 255			D. 256
4.在写递归函数时,哪些定义一般不写在递归函数中(   )
A. int			B. float			C. double		D. 数组		
5.一棵完全二叉树,共有1234个节点,其叶子结点的个数为(    )
A. 615			B. 616			C. 617			D. 210
6.某公司派赵钱孙李周五人出国学习,选派条件是
	a. 若赵去;钱也去				b. 李、周两人至少有一人去
	c. 若周去,则赵、钱也同去		d. 孙、李二人同去或同不去
	e. 钱、孙两人中只有一个人去
那么可以选派的方案是(   )
 A. 孙赵周去
 B. 赵钱周去
 C. 李周去
 D. 钱孙去
7.已知一棵二叉树前序遍历为ABCDEFGI,后序遍历为CEDBIGFA,则其中序遍历可能为(    )
A.ABCDEFGI
B.CBEDAFIG
C.CBDEAGFI
D.CBEDAIFG
8.8颗子弹,编号为1、2、3、4、5、6、7、8,从编号1开始按序压入弹夹,以下有哪个不是正常的打出子弹的次序(   )
A.12345678
B.87654321
C.32154876
D.32164587
9.已知循环队列空间为30,队头位置编号为12,队尾元素下一个空位置编号为5,则对伍中元素个数为(   )
A. 24			B. 23			C. 7				D. 8
10.甲箱中有200个螺杆,其中160个A型螺杆;乙箱中有240个螺母,其中有180个A型的。现从甲乙两箱中各任取一个,则能配成A型螺栓的概率有多少?(     )
A. 1/20			B. 19/20			C. 3/5			D. 15/16
11.今年信息学进复赛的同学有6人,老师将他们排成一圈发奖品,请问有几种排法(    )
A. 60			B. 120			C. 180			D. 240
12.设二维数组A的行下标为0至5,列下标为1至5,F的每个数据元素均占2个字节。在按行存储的情况下,已知数据元素A[3][3]的第一个字节是2019,则A[4][4]的第一个字节的地址为(    )
A. 2029			B. 2025			C. 2031			D. 2033
13.在下图中,有(  )个顶点出发存在一条路径可以遍历图中的每条边,而且仅遍历一次。

A. 6				B. 2				C. 3				D. 4
14.有A、B、C、D、E、F六个绝顶聪明又势均力敌的盗墓贼,他们都排着队,他们每个人都想独吞财宝,最前面的A如果拿了财宝,那么体力下降,则其后面的B会杀掉A,当然B拿了财宝,体力也会下降,一样会被C杀掉。如果B不拿财宝,则C无法杀B,请问A、C、E的最终想法是(    ) 
A.A不拿C不拿E拿
B.A拿C拿E不拿
C.A不拿C不拿E不拿
D.A不拿C拿E拿
15.以下哪个协议不属于应用层(   )
A.HTTP 		B. FTP			C. TELNET		D. UDP

二、阅读程序(程序输入不超过数组或字符串自定义的范围,判断题正确填T,错误填F,除特殊说明外,判断题1.5分,选择题3分,共计40分)
(1)
1.#include < bits/stdc++.h >
2.using namespace std;
3.int main(){
4.    string s;
5.    char s1[100];
6.    int len, j = 0;
7.    cin > > s;
8.    len = s.size();
9.    memset(s1, 0, sizeof(s1));
10.    for (int i = 0; i < len; i++){
11.        if (i % 2 == 0)
12.            if ((s[i] > = 'A' && s[i] < 'Z') || (s[i] > = 'a' && s[i] < 'z')){
13.                s1[j] = s[i] + 1;
14.                ++j;
15.            }
16.    }
17.    cout < < s1 < < endl;
18.    return 0;
19.}

判断题
16.输出的字符串只能是字母组成。(   )   
17.将12行的 < 改为 < = 则输出结果有可能包含数。(      )      
18.将第9行删除,程序运行结果不会改。(      )
19.将第11行删除,输出字符的长度和输入字符的长度一致。(    )    
选择题
20.如输入的字符串长度为10,则输出的字符串长度最长可能为多少。(    )
A. 4				B. 5				C. 6				D. 10
21.如输入的字符串都是字母,则输出中哪个字母可能出现(     )。
 	A. A				B. Z				C. a				D. 以上都不对

(2)
1.#include < iostream >
2.using namespace std;
3.int main(){
4.    int a[1001],i,j,t,n;
5.    for (i=0;i < =1000;i++)
6.        a[i]=0;
7.    scanf("%d",&n);
8.    for(i=1;i < =n;i++){
9.        scanf("%d",&t);
10.        a[t]++;
11.    }
12.    for(i=1000; i > =0;i--)
13.        for(j=1; j < =a[i];j++)
14.            printf("%d ",i);
15.    return 0;
16.}
判断题
22.输入10个数字,输出结果是从小到大。(     )  
23.输入的数字中有2个1,则输出来时第一个1是第一个输入。(    )  
24.第13行的 < = 改为 < 号,且输入数据为 : 
10 
2 1 2 3 3 3 4 9 8 7
则输出:9
(    )
25.第12行改为for(i=0;i < = 1000;i++) 则程序运行结果不变。(    ) 
选择题
26.第12行改为for(i=1000;i > 1;i--);第13行改为for(j=a[i]; j > 1;j--)输入数据为:
5
2 12 33 34 44
则运行结果(   )
A.不变							
B.输出:2 12 33 34 44
C.无输出
D.输出:44 34 33 12 2
27.第10行改为++a[t] 和a[t++],输入:
5
1 2 3 4 5
输出结果为:
A.1 2 3 4 5 和 5 4 3 2 1
B.1 2 3 4 5 和 无输出
C.5 4 3 2 1 和 5 4 3 2 1
D.5 4 3 2 1 和 无输出

(3)
1.#include < bits/stdc++.h >
2.using namespace std;
3.const int maxn=500000,INF=0x3f3f3f3f;
4.int L[maxn/2+2],R[maxn/2+2];
5.void unknown(int a[],int n,int left,int mid,int right){
6.    int n1=mid-left,n2=right-mid;
7.    for (int i=0;i < n1;i++)
8.        L[i]=a[left+i];
9.    for (int i=0;i < n2;i++)
10.        R[i]=a[mid+i];
11.    L[n1]=R[n2]=INF;
12.    int i=0,j=0;
13.    for (int k=left;k < right;k++){
14.        if (L[i] < =R[j])
15.            a[k]=L[i++];
16.        else 
17.            a[k]=R[j++];
18.    }
19.}
20.void unknownsort(int a[],int n,int left,int right){
21.    if (left+1 < right){
22.        int mid =(left+right)/2;
23.        unknownsort(a,n,left,mid);
24.        unknownsort(a,n,mid,right);
25.        unknown(a,n,left,mid,right);
26.    }
27.}
28.int main(){
29.    int a[maxn],n;
30.    cin > > n;
31.    for(int i=0;i < n;i++) cin > > a[i];
32.    unknownsort(a,n,0,n);
33.    for (int i=0;i < n;i++){
34.        if(i)   cout < < " ";
35.        cout < < a[i];
36.    }
37.    cout < < endl;
38.    return 0;
39.}
判断题
28.第13 行的 < 改为 < = 将不会改变运行结果(    )
29.第 21行的 < 改为 < = 将不会改变运行结果(    )
30.此类排序方法是高效的但是不稳定(  )
31.第4行的2个”+2”都去掉将不会改变运行结果。(  )
选择题
32.此题是哪种排序(   )
A. 选择排序			B. 桶排序			C. 归并排序			D. 堆排序
33.此题用到了(    )思想
A. 动态规划			B. 分治				C. 冒泡				D. 贪心
34.


三、三、完善程序(单选,每题3分,共计30分)
第一题:田忌赛马,田忌每赢一次齐王的马就得200金币,当然输了就扣200金币,平局则金币数不变。
1.#include< bits/stdc++.h >
2.using namespace std;
3.int main(){
4.    int n;
5.    while(cin > > n&&n!=0){
6.        int tj[1001],king[1001],count=0;
7.        int tj_min=0,tj_max=n-1;
8.        int king_min=0,king_max=n-1;
9.        for (int i=0;i < n;i++) cin > > tj[i];
10.        for (int i=0;i < n;i++) cin > > king[i];
11.        sort(tj,tj+n);
12.        sort(king,king+n);
13.        while(n--){
14.            if (tj[____(1)_____)] > king[____(2)____]){
15.                count++;
16.                tj_max--;
17.                king_max--;
18.            }
19.            else if(tj[___(3)___] < king[____(4)____]){
20.                count--;
21.                tj_min++;
22.                king_max--;
23.            }
24.            else
25.            {
26.                if (tj[tj_min] > king[king_min]){
27.                    count++;
28.                    ___(5)____;
29.                    ___(6)____;
30.                }
31.                else{
32.                    if (____(7)_____)
33.                        count--;
34.                    tj_min++;
35.                    _____(8)_____;
36.                }
37.            }
38.        }
39.        cout < < count*200 < < endl;
40.    }
41.    return 0;
42.}
34.(1)和(2)处填(   )
A.tj_max 和 king_max
B.tj_min 和 king_max
C.tj_min 和 king_min
D.tj_max 和 king_min
35.(3)和(4)处填(   )
A.tj_min 和 king_max
B.tj_min 和 king_min
C.tj_max 和 king_max
D.tj_max 和 king_min
36.(5)和(6)处填(   )
A.tj_min-- 和 king_min++
B.tj_max++ 和 king_min++
C.tj_min++ 和 king_min++
D.tj_max++ 和 king_min--

37.(7)处填(   )
A.tj[tj_min] < king[king_max]
B.tj[tj_min] > king[king_max]
C.tj[tj_max] < king[king_max]
D.tj[tj_min] > king[king_min]
38.(8)处填(   )
A.king_max--
B.king_max++
C.king_min--
D.King_min++

第二题:
寻路问题:N*N矩阵,其中0是表示可以走的,1表示无法走,矩阵有二维数组表示,左上角是入口,右下角是出口,只能横着走和竖着走,要求找出最短路径
1.#include < bits/stdc++.h >
2.using namespace std;
3.int mymax=10000;
4.int f[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
5.int a[20][20],v[20][20],v1[20][20];
6.int l=1;
7.int n;//矩阵的规模
8.bool check(int x1,int y1){
9.    if (x1 < 0||x1 > = n||____(1)____)return false;
10.    if (a[x1][y1]==1]||______(2)_____) return false;
11.    return true;
12.}
13.void dfs(int x,int y){
14.    int (x==n-1&&y==n-1){
15.        if (l < mymax){
16.            mymax = l;
17.            memcpy(v1,v,sizeof(v1));
18.        }
19.        return; 
20.    }
21.    for (int k=0;k < 4;k++){
22.        int x1,y1;
23.        x1=x+___(3)___;
24.        y1=y+___(4)___;
25.        if (check(x1,y1)){
26.            ____(5)____;
27.            ____(6)____;
28.            dfs(x1,y1);
29.            ____(7)____;
30.            v[x1][y1]=0;
31.        }
32.    }
33.}
34.int main(){
35.    cin > > n;
36.    for (int i=0;i < n;i++){
37.        for (int j=0;j < n;j++)
38.            cin>>a[i][j];
39.    }
40.    dfs(0,0);
41.    int d=v1[n-1][n-1];
42.    int x=n-1,y=n-1;
43.    int k;
44.    int qn[400][2];
45.    qn[0][0]=n-1;
46.    qn[0][1]=n-1;
47.    for (k=1;;k++){
48.        x=x-f[d][0];
49.        y=y-f[d][1];
50.        qn[k][0]=x;
51.        qn[k][1]=y;
52.        d=v1[x][y];
53.        if (x==0&&y==0) break;
54.    }
55.    for (int i=k;i > = 0;i--)
56.        cout < < ____(8)___ < < "," < < ____(9)____ < < endl;
57.    return 0;
58.}

39.(1)和(2)处填(   )
A.y1 < = 0 || y1 > n 和 v[x1][y1] > 0
B.y1 <  0 || y1 > = n 和 v[x1][y1] > 0
C.y1 > 0 || y1 < = n 和 v[x1][y1] > 0
D.y1 > 0 || y1 < n 和 v[x1][y1] > 0
40.(3)和(4)处填(   )
A.f[k][0] 和 f[k][1]
B.f[k][1] 和 f[k][0]
C.f[0][k] 和 f[1][k]
D.f[1][k] 和 f[0][k]
41.(5)处填(   )
A.v[x1][y1]=k+1;
B.v[x1][y1]=k;
C.v[x][y]=k;
D.v[x][y]=k+1;
42.(6)和(7)处填(   )
A.l++ 和 l--
B.k++ 和 k--
C.x1++ 和 x1--
D.y1++ 和 y1--
43.(8)和(9)处填(   )
A.qn[i][1] 和 qn[1][2]
B.qn[i][0] 和 qn[i][1]
C.qn[1][i] 和 qn[2][1]
D.qn[0][i] 和 qn[1][i]

 

 

要答案的私聊我^_^

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值