当前位置: 代码迷 >> 综合 >> 2020CSP-J2
  详细解决方案

2020CSP-J2

热度:38   发布时间:2024-02-24 22:39:13.0

2020CSP-J2

一、 单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1. 设栈S的初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在S栈上依次进行如下操作(从序列中的1开始,出栈后不在进栈):进栈、进栈、进栈、出栈、进栈、出栈、进栈。试问出栈的元素序列是(   )
A. {5,4,3,2,1}			B. {2,1}				C. {2,3}				D. {3,4}2. 设循环队列数组中的下标范围是n,其中头尾指针分别是f和r,则其元素个数是(   )
A. r-f				B. r-f+1				C. (r-f) MOD n+1		D. (r-f+n) MOD n3. 电线上停着两种鸟(A,B),可以看出两只相邻的鸟就将电线分为了一个线段。这些线段可分为两类:一类是两端的小鸟相同;另一类是两端的小鸟不相同。已知:电线上两个顶点上正好停着相同的小鸟,试问两端为不同小鸟的线段数目一定是(   )
A. 奇数				B. 偶数				C. 可奇可偶			D. 数据固定4. 从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端,这种排序方法称为(   )
A. 插入排序			B. 归并排序			C. 选择排序			D. 快速排序5. 对于一个满二叉树,m个树叶,l个分枝节点,n个节点,则(    )
A. n=l+m			B. l+m=2n			C. m=l-1				D. n=2l-16. 已知元素(8,25,14,87,51,90,6,19,20),问这些元素以怎样的顺序进入栈,才能使出栈的顺序满足:8在51前面,90在87的后面,20在14的后面,25在6的前面,19在90的后面。(    )
A. 20,6,8,51,90,25,14,19,87
B. 51,6,19,20,14,8,87,90,25
C. 19,20,90,8,6,25,51,14,87
D. 6,25,51,8,20,19,90,87,147. 假设我们用d=(a1,a2,…,a5),表示无向图G的5个顶点的度数,下面给出的哪组d值合理(   )
A. {2,2,2,2,2}
B. {1,2,2,1,1}
C. {3,3,3,2,2}
D. {5,4,3,2,1}8. 使用冒泡排序对序列进行升序排列,每执行一次交换操作系统将会减少1个逆序对,因此序列 5,4,3,2,1需要执行(  )次操作,才能完成冒泡排序。  
A.0 		B.5 		C.10 		D.15 
9. 1946年诞生于美国宾夕法尼亚大学的ENIAC属于(    )计算机。 
A.电子管 	B.晶体管 	C.集成电路 	D.超大规模集成电路10.(    )就是把一个复杂的问题分成两个或更多的相同类似的子问题,再把子问题分解成更小的子问题……直到最后的子问题可以简单地直接求解。而原问题的解就是子问题解的并。
A.动态规划 	B.贪心 	C.分治 	D.搜索11.地址总线的位数决定了CPU可直接寻址的内存空间大小,例如地址总线为16位,其最大的可寻址空间为64KB。如果地址总线是32位,则理论上最大可寻址的内存空间为(      )。 
A.128KB 	B.1MB 		C.1GB 		D.4GB12.原字符串中任意一段连续的字符所组成的新字符串称为子串。则字符“AAABBBCCC”共有(  )个不同的非空子串。
A.3 		B.12 		C.36 		D.4513.十六进制数9A在(    )进制下是232。
A.四 		B.八 		C.十 		D.十二14.如果一棵二叉树的中序遍历是BAC,那么它的先序遍历不可能是( )。 
A.ABC 		B.CBA 		C.ACB 		D.BAC15. 在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。
A.系统分配的栈空间溢出 	B.系统分配的堆空间溢出 
C.系统分配的队列空间溢出 	D.系统分配的链表空间溢出二、 阅读程序(程序输入不超过数组或字符串定义的范围,判断题正确填T,错误填F;除特殊说明外,判断题1.5分,选择题4分,共计40分)
1)
1.	#include <iostream>
2.	#include <cmath>
3.	using namespace std;
4.	
5.	bool IsPrime(int num)
6.	{
7.	    for (int i=2;i<=sqrt(num);i++)
8.	    {
9.	        if (num%i==0)
10.	        {
11.	            return false;
12.	        }
13.	    }
14.	    return true;
15.	}
16.	int main()
17.	{
18.	    int num=0;
19.	    cin>>num;
20.	    if (IsPrime(num))
21.	    {
22.	        cout<<"YES"<<endl;
23.	    }
24.	    else
25.	    {
26.	        cout<<"NO"<<endl;
27.	    }
28.	    return 0;
29.	}16.(1分)输入97时,输出为“YES”(不含引号)    
17.(1分)输入119时,输出为“NO”(不含引号)      
18. 若将第7行的“<=” 改成“<”,程序输出的结果一定不会改变。     
19. 当程序执行第14行时,i的值为sqrt(num)        选择题
20.(3分)最坏情况下,此程序的时间复杂度是(  )
A. $O(num)$			B. $O(num^2)$		C. $O(\sqrt{num})$		D. $O(\log num)$
21. 若输入的num为20以内的正整数,则输出为“YES”的概率是(   )
A. 0.45				B. 0.4				C. 0.5					D. 0.352)
1.	#include<bits/stdc++.h>
2.	using namespace std;
3.	const int mod=2048;
4.	long long c,n;
5.	long long kasumi(long long x,long long mi){
6.	    long long res=1;
7.	    while(mi){
8.	        if (mi&1){
9.	            res=(res*x)%mod;
10.	        }
11.	        x=(x*x)%mod;
12.	        mi>>=1;
13.	    }
14.	    return res;
15.	}
16.	int main(){
17.	    cin>>n>>c;
18.	    if(n==3){
19.	        printf("%lld",c*(c-1));
20.	        return 0;
21.	    }
22.	    long long ans=((kasumi(c-1,n)+(c-1)*kasumi(-1,n))%mod+mod)%mod;
23.	    cout<<ans;
24.	    return 0;
25.	}判断题
22.(1分)将第9行和第11行的括号去掉,程序输出结果一定不变。 
23.(1分)将第12行的“mi>>=1”改为“mi*=0.5”,程序的输出结果一定不变。 
24. 若输入为“4 4”,则输出为“78”。 
25. 此程序的时间复杂度为 $O(\log n)$。   选择题:
26. 如输入为“3 4”,则输出为(   )
A. 24				B. 12				C. 18				D. 19
27. kasumi(2046,13)的返回值为(    )
A. 0					B. 2022				C. 2					D. 20243)
1.	#include<cstdio>
2.	int n,r,num[10000];
3.	bool mark[10000];
4.	void print()
5.	{
6.	    for(int i=1;i<=r;i++)
7.	        printf("%d ",num[i]);
8.	    printf("\n");
9.	}
10.	void search(int x)
11.	{
12.	    for(int i=1;i<=n;i++)
13.	        if(!mark[i])
14.	        {
15.	            num[x]=i;
16.	            mark[i]=true;
17.	            if(x==r)    print();
18.	            search(x+1);
19.	            mark[i]=false;
20.	        }
21.	}
22.	int main()
23.	{
24.	    scanf("%d%d",&n,&r);
25.	    search(1);
26.	}   判断题
28.(1分)程序结束时,对于任意1<=i<=n,mark[i]=0.   
29.(2分)若n<r,则程序无输出。 
30.(2分)若输入为”4 3”,则输出中数字1和2的个数不同 
31.(2分)此程序的时间复杂度为O(n)  选择题
32. 若输入为“6 3”,则函数print的执行次数为(   )
A. 60 				B. 120 				C. 6 			D. 720
33. 若输入为“7 4”,则输出的最后一行为(   )
A. 4 5 6 7			B. 7 6 5 4			C. 4 3 2 1		D. 1 2 3 4三、 完善程序(单选题,每小题3分,共计30分)
1). 克鲁斯卡尔求最小生成树思想:首先将n个点看做n个独立的集合,将所有边快排(从小到大)。然后,按排好的顺序枚举每一条边,判断这条边连接的两个点是否属于一个集合。若是,则将这条边加入最小生成树,并将两个点所在的集合合并为一个集合。若否,则跳过。直到找到n-1条边为止。
1.	#include<iostream>
2.	#include<algorithm>
3.	using namespace std;
4.	struct point{
5.	    int x;
6.	    int y;
7.	    int v;
8.	};
9.	point a[10000];
10.	
11.	int cmp(const point &a,const point &b){
12.	    if (  ①  ) return 1;
13.	    else return 0;
14.	}
15.	
16.	int fat[101];
17.	int father(int x){
18.	    if (fat[x]!=x) return fat[x]=(  ②  );
19.	    else return fat[x];
20.	}
21.	
22.	void unionn(int x,int y){
23.	    int fa=father(x);
24.	    int fb=father(y);
25.	    if (fa!=fb) fat[fa]=fb;
26.	}
27.	
28.	int main(){
29.	    int i,j,n,m,k=0,ans=0,cnt=0;
30.	    cin>>n;
31.	    for(i=1;i<=n;i++)
32.	        for(j=1;j<=n;j++)
33.	            {
34.	                cin>>m;
35.	                if (m!=0){
36.	                    k++;
37.	                    a[k].x=i;
38.	                    a[k].y=j;
39.	                    a[k].v=m;
40.	                }
41.	            }
42.	    sort(a+1,a+1+k,③);
43.	
44.	    for (i=1;i<=n;i++){
45.	        fat[i]=i;
46.	    }
47.	
48.	    for(i=1;i<=k;i++){
49.	        if (father(a[i].x)!= ④ ){
50.	            ans+=a[i].v;
51.	            unionn(a[i].x,a[i].y);
52.	            cnt++;
53.	        }
54.	        if (  ⑤  ) break;
55.	    }
56.	
57.	    cout<<ans;
58.	    return 0;
59.	    
60.	}
34. ①处应填(    )
A. a.v < b.v
B. a.v > b.v
C. a.v >= b.v
D. a.v <= b.v
35. ②处应填(    )
A. father(x)
B. father(fat[x])
C. fat[father(x)]
D. x
36. ③处应填(    )
A. algorithm
B. point
C. cmp
D. sizeof(a)
37. ④处应填(    )
A. a[i].y
B. father(a[i].y)
C. fat[a[i].y]
D. a[i].x
38. ⑤处应填(    )
A. cnt > 0
B. i == 1
C. ans == n-1
D. cnt == n-11). 欧拉回路问题由七桥问题而来,其基本问题是是否能够一次性不重复地走遍这七座桥,转换为数学问题中的图论就是指的是从图中的一个顶点出发,是否能够一次性不回头地走遍所有的边,算法代码如下:
1.	#include<iostream>
2.	#include<ctime>
3.	using namespace std;
4.	int G[5][5];
5.	int visted[5][5];
6.	int n=5;
7.	void euler(int u){
8.	    for (int v=0;v<n;v++){
9.	        int (G[u][v] && ① ){
10.	            cout<<u<<"->"<<v<<endl;
11.	            visited[u][v]=visted[v][u]= ② ;
12.	            ③
13.	        }
14.	    }
15.	}
16.	int main(){
17.	    G[1][2]=G[2][1]=G[1][3]=   ④  =1;
18.	    G[2][4]=G[4][2]=G[3][4]=   ⑤  =1;
19.	    euler(1);
20.	    return 0;
21.	}39. ①处应填(   )
A. G[v][u]
B. !visited[u][v]
C. visited[u][v]
D. Visited[v][u]
40. ②处应填(   )
A. 1				
B. 0				
C. u				
D. v
41. ③处应填(   )
A. euler(v);
B. euler(u);
C. G[u][v]=0;
D. G[v][u]=0;
42. ④处应填(   )
A. G[0][1]
B. G[1][0]
C. G[3][1]
D. G[0][3]
43. ⑤处应填(   )
A. G[0][2]
B. G[2][0]
C. G[2][1]
D. G[4][3]

 

要答案的私聊我^_^

  相关解决方案