CSP-J 练习K卷

*
您的姓名:
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
1.
正整数 2024 与 1840 的最大公约数是()。
A. 46
B. 92
C. 44
D. 184
2.
十进制数 28 与二进制数 10 0000 0111 0000 求和的结果是()。
A.十进制数 8332
B.十六进制数 208A
C.二进制数 1000 0000 0110
D.八进制数 20212
3.
C++程序中,(25|6)^5的值是()。
A. 25
B. 26
C. 27
D. 28
4.
在数组 A[x] 中,若存在 (i<j) 且 (A[i] > A[j]), 则称 (A[i],A[j]) 为数组 A[x] 的一个逆序对。对于序列 (7,4,1,9,3,6,8,5),在不改变顺序的情况下,去掉()会使逆序对的个数减少 4。
B. 3
C. 6
D. 5
A. 1
5.
如果字符串 s 在字符串 A 中出现了,则字符串 s 被称作字符串 A 的子串。设字符串 A="players",A 的非空子串的数目是()。
D. 30
A. 27
B. 29
C. 28
6.
以下哪种算法的主要框架不是非比较排序?()
A.计数排序
B.堆排序
C.基数排序
D.桶排序
7.
采用了倍增法的程序运行的时间复杂度是()。
A.O(logn)
B.O(n)
C. O(n^2)
D. O(nlogn)
8.
将数组 {9,33,5,18,71,3,52,85} 中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换()次。
A. 4
B. 5
C. 6
D. 7
9.
关于计算机网络,下面的说法中哪个是正确的?()
A.计算机网络是一个管理信息系统
B.计算机网络是一个管理数据系统
C.计算机网络是一个在协议控制下的多机互联系统
D.计算机网络是一个独立的操作系统
10.
下列哪款软件不是操作系统软件的名字?()
A.安卓
B. Windows 11
C.华为鸿蒙
D. ChatGPT
11.
下述选项中哪个不是算法描述的通用方法?()
A.自然语言
B.流程图
C.人工智能
D.伪代码
12.
若A=True,B=False,C=True,D=False,以下逻辑运算表达式的运算结果为真的是()。
A. (AΛB)V(CΛDV﹁A)
B. ((ΑΛB)ΛC)Λ﹁B
C. (BVCVD)VDΛA
D. (AΛ(DV﹁C)ΛB
13.
一棵二叉树的高度为h(假设根高度=1),所有结点的度数都为 0 或 2,则此树最少有()个结点。
A. 2^h-1
B. 2h-1
C.2h+1
D. h+1
14.
从 12 个人中选出 5 个人,其中甲、乙、丙必选的方法共有()种。
A. 60
B. 36
C. 72
D. 120
15.
在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。
A. 1/2
B. 2
C. 1
D. 4
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填A,错误填B:除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
01 #include<bits/stdc++.h>
02 using namespace std;
03 char change(char str)
04 {
05     if(str >= 'a' && str <= 'z')
06         str -= 32;
07     return str;
08 }
09 int main()
10 {
11 
12     string s1,s2;
13     cin >> s1 >> s2;
14     int cnt = 0;
15     for(int i = 0; i < s1.size(); i++)
16     {
17         for(int j = 0; j < s2.size(); j++)
18             if(change(s1[i]) == change(s2[j]))
19                 cnt++;
20     }
21     cout << cnt;
22     return 0;
23 }
判断题
16.
将第 1 行头文件改为#include<iostream>,程序的运行结果不会改变。()
17.
将第 5 行中的 'a' 替换为 97,程序的运行结果不会改变。()
18.
将第 6 行中的 32 替换为' ',程序的运行结果不会改变。()
19.
将第 14 行代码中 = 0去掉,程序的运行结果不会改变。()
选择题
20.
若输入数据为 ABCDE  AbCdE,则输出为()。
A. 3
B. 5
C. 2
D. 0
21.
若输入数据为WorldYiwuAsiaShanghai  ChinaHangzhouZhejiangJinhua,则输出为()。
A. 36
B. 40
C.42
D. 44
(2)
01 #include<iostream>
02 using namespace std;
03 int solve(int n,int m)
04 {
05     int i,sum;
06     if(m==1)
07         return 1;
08     sum=0;
09     for(i=1;i<n;i++)
10         sum += solve(i,m-1);
11     return sum;
12 }
13 int main()
14 {
15     int n,m;
16     cin>>n>>m;
17     cout<<solve(n,m)<<endl;
18     return 0;
19 }
判断题
22.
如果 n 输入一个负整数,程序的运行会出错。()
23.
如果 n 输入一个正整数,m 输入一个负整数,那么程序会进入死循环,不会输出任何结果。()
24.
若输入 4 4,则程序的运行结果为1。()
25.
若输入 4- 1,则程序的运行结果为0。()
选择题
26.
若输入为7 4,则输出为()。
A. 20
B. 10
C. 15
D. 5
27.
若输出为 10,则输入可能为()。
A. 5 3
B. 5 4
C. 6 4
D. 6 5
(3)
01 #include<bits/stdc++.h>
02 using namespace std;
03 const int MAXN = 2e5 + 5;
04 int nums[MAXN];
05 int left_bound(int n,int target){
06     int left = 0, right = n - 1;
07     while(left <= right){
08         int mid = (left + right) / 2;
09         if(nums[mid] < target)
10             left = mid + 1;
11         else
12             right = mid - 1;
13     }
14     if(left < n && nums[left] == target)
15         return left;
16     return -1;
17 }
18 int right_bound(int n,int target){
19     int left = 0, right = n - 1;
20     while(left <= right){
21         int mid = (left + right) / 2;
22         if(nums[mid] <= target)
23             left = mid +1;
24         else
25             right = mid - 1;
26     }
27     if(right >= 0 && nums[right] == target)
28         return right;
29     return -1;
30 }
31 int main()
32 {
33     int n,c;
34     cin>>n>>c;
35     for(int i = 0; i < n; ++i)
36         cin>>nums[i];
37     sort(nums,nums+n);
38     long long ans = 0;
39     for(int i = 0; i < n; ++i){
40         int left = left_bound(n,nums[i] + c);
41         int right = right_bound(n,nums[i] + c);
42         if(left != -1)
43             ans += right - left + 1;
44     }
45     cout<<ans<<endl;
46     return 0;
47 }
判断题
28.
本段程序的算法用到了二分算法的思想。()
29.
将第 3 行中的 const 去掉,程序的运行结果不变。()
30.
将第 14 行中的 left<n 去掉,程序的运行结果不变。()
31.
将第 38 行中的 long long 替换为 int,程序的运行结果不变。()
选择题
32.
第 8 行的写法在某些时候会导致程序运行有问题,最好换成写法()。
A. mid = (left + right) << 1
B. mid = left + (right - left) / 2
C. mid = left + (right - left) >> 1
D. mid = (left + right) % 2
33.
本程序的时间复杂度为()。
A. O(logn)
B.O(n)
C. O(n^2)
D. O(nlogn)
34.
(4分)当输入
4 1
1 1 2 3
时,程序的输出结果为()。
A. 1
B. 2
C. 3
D. 4
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1)

给定一棵树,输出树的根 root、孩子结点最多的结点 max 以及它的孩子结点。

输入格式:

    第 1 行输入 n(结点数≤100)和m(边数≤200)。以下 m 行输入每行两个结点 x 和 y,表示 y 是 x 的孩子结点(x,y≤1000)。

输出格式:

    第 1 行是树根 root。第 2 行是孩子结点最多的结点 max。第 3 行是 max 的孩子结点。

输入样例:

    8 7

    4 1

    4 2

    1 3

    1 5

    2 6

    2 7

    2 8

输出样例:

    4

    2

    6 7 8 


01 #include<bits/stdc++.h>
02 using namespace std;
03 int n,m,tree[105]={0};
04 int main()
05 {
06     int i,x,y,root,maxroot,sum=0,j,Max=0;
07     cin>>n>>m;
08     for(i=1;i<=m;i++)
09     {
10         cin>>x>>y;
11         ①;
12     }
13     for(i=1;i<=n;i++) //找出树的根
14         if(②)
15         {
16             root=i;
17             ③;
18         }
19     for(i=1;i<=n;i++) //找孩子结点最多的结点
20     {
21         sum=0;
22         for(j=1;j<=n;j++)
23             if(tree[j]==i)
24                 sum++;
25             if(④)
26             {
27                 Max=sum;
28                 maxroot=i;
29             }
30     }
31     cout<<root<<endl<<maxroot<<endl;
32     for(i=1;i<=n;i++)
33         if(⑤)
34             cout<<i<<" ";
35     return 0;
36 }

35.
①处应填()。
A. tree[y] = x
B. tree[x] = y
C. tree[y] = i
D. tree[x] = i
36.
②处应填()。
A. tree[i] == 1
B. tree[i] == 0
C. tree[i] == 2
D. tree[i] != 0
37.
③处应填()。
A. break
B. continue
C. return 0
D. exit
38.
④处应填()。
A. sum == Max
B. sum <= Max
C. sum > Max
D. sum < Max
39.
⑤处应填()。
A. tree[i] != maxroot
B. tree[i] <= maxroot
C. tree[i] >= maxroot
D. tree[i] == maxroot
(2)

快速排序是一种高效的排序算法,我们常用的 STL 函数 sort 就是采用快速排序思想实现的。如下代码是一个经典的快速排序过程,输入一个整数 n,然后输入 n 个整数,程序会按照从小到大的顺序将所有整数进行排序并输出。请将程序补充完整。


01 #include<bits/stdc++.h>
02 using namespace std;
03 int a[1005];
04 void quickSort(int a[],int begin,int end)
05 {
06     int i,j,temp;
07     if(begin >= end)
08         return;
09     ①;
10     i = begin;
11     j = end;
12     while(i < j)
13     {
14         while(a[j] > tmp)
15             j--;
16         while(②)
17             i++;
18         if(i != j)
19             swap(a[i],a[j]);
20     }
21     ③;
22     ④;
23     quickSort(a,i+1,end);
24 }
25 int main()
26 {
27     int n;
28     cin>>n;
29     for(int i=1;i<=n;i++)
30         cin>>a[i];
31     ⑤;
32     for(int i=1;i<=n;i++)
33         cout<<a[i]<<" ";
34     return 0;
35 }

40.
①处应填()。
A. tmp = a[begin]
B. tmp = a[i]
C. tmp = a[j]
D. tmp = a[end]
41.
②处应填()。
A. a[i] >= tmp && i < j
B. a[i] >= tmp &8 i > j
C. a[i]<= tmp && i >j
D. a[i] <= tmp && i < j
42.
③处应填()。
A. swap(a[i],a[j])
B. swap(a[begin],a[i])
C. swap(a[begin],a[j-1])
D. swap(a[begin],a[end])
43.
④处应填()。
A. quickSort(a,begin,j-i+1)
B. quickSort(a,begin,i-1)
C. quickSort(a,1,i)
D. quickSort(a,1,i-1)
44.
⑤处应填()。
A. quickSort(a,1,n-1)
B. quickSort(a,0,n-1)
C. quickSort(a,1,n)
D. quickSort(a,0,n)
问卷星提供技术支持
举报