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] |