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]++;
要答案的私聊我^_^