手机扫描二维码答题
00:00:00
CSP-J 练习E卷
录音中...
考试满分:100分;考试时间:120分钟;
*
姓名
*
班级
一、单选题 (总共15小题,每题2分,共30分)
*
1.1.以下说法中正确的是( )。
A.计算机系统包括硬件系统和软件系统
B.小型机亦称为微机
C.数字计算机可直接处理连续变化的模拟量
D.主机包括CPU、显示器
*
2.操作系统是( )。
A.用户与软件的接口
B.系统软件与应用软件的接口
C.主机与外设的接口
D.用户与计算机的接口
*
3.某算法的部分流程图如下图所示。执行这部分流程,若依次输入x的值为6,10,15,20,28,则输出结果分别为( )
A.0,1,0,1,0
B.1,0,1,0,1
C.1,0,0,0,1
D.0,0,1,0,1
*
4.—个两位十进制正整数n转换为二进制数m,下列说法正确的是( )。
A. m的位数最多是8位
B.删除m的最右边两位后转换为十进制数x,则x=n/4
C. m乘以2的值可能是(11000111)2
D.如果n的个位数字是3,则m的最低位数字可能是0
*
5.机房里某台计算机无法访问互联网,检查发现,是TCP/IP属性设置有错误,如下图。修正方法是( )
A.参数③改为255、255、255、0 , 其它不变
B.参数②改为192、168、10、1 ,其它不变
C.参数①与参数③交换
D.参数①与参数②交换
*
6.一个字节(byte)由( )个二进制位组成。
A. 2
B. 4
C. 8
D. 16
*
7.前缀表达式“-*+2432”的值是( )
A. 12
B. 14
C.16
D. 18
*
8.一个字长为8位的整数的补码是1100 1001,则它的原码是( )。
A. 1100 1001
B. 1011 0110
C. 1011 0101
D. 1011 0111
*
9.基于比较的排序时间复杂度的下限是( ) ,其中n表示待排序的元素个数。
A. O (n)
B. O (nlogn)
C. O (logn)
D. O (n2)
10.一棵二叉树的前序遍历序列是ABDECFG,后序遍历序列是DEBFGCA。则根结点的左子树的结点个数可能是( )。
A.2
B.3
C.4
D.5
11. 假设给定有向无环图 G 中具有 n 个顶点和 m 条边,则对图 G 进行拓扑排序的时间 复杂度为( )。
A.O(n+m)
B.O(n*m)
C.O(nlogn)
D.O(mlogn)
*
12.对于序列“7, 5, 1, 9, 3, 6, 8, 4”的逆序对为( )。
A.12
B.13
C.14
D.15
*
13.将数字1,2,3,4填入标号为1,2,3,4的四个方格里,每格填一个数,则每个方格的标号与所填数字均不相同的填法有( )。
A、6种
B、9种
C、11种
D、23种
*
14. 给定完全二叉树T从上到下从左到右进行1至n的编号,则对于编号为i的结点(i≠1),则结点i双亲结点是( )。
A.
B.
C.2i
D.2i+1
*
15.以 a 为起点,对右边的无向图进行广度优先遍历,则 b、 c、 d、 e 四个点中有可能作 为最后一个遍历到的点的个数为( )。
A. 1
B. 2
C. 3
D. 4
第II卷(阅读程序题)
总共3道大题,每道大题含6道小题,判断题和单项选择题。判断题正确填“✓”,错误填“x”。除特殊说明外,每道判断题1.5分,每道单项选择的3分。总共40分。
一、
1. #include <bits/stdc++.h>
2. using namespace std;
3. bool is_prime(int x) {
4. for (int i = 2; i < x; ++i)
5. if (x % i == 0) return false;
6. return true;
7. }
8. int main() {
9. int n;
10. cin >> n;
11. for (int i = 2, cnt = 0; true; i++) {
12. if (is_prime(i)) cnt++;
13. if (cnt == n) {
14. cout << i << endl;
15. break;
16. }
17. }
18. return 0;
19. }
*
1、将第4行”i<x”改成”i*i<x”代码运行结果不变。( )
对
错
*
2、将第5行的”return false”改为”break”代码运行结果不变。( )
对
错
*
3、程序15行的”break”改为”return 0”代码运行结果不变。( )
对
错
*
4、程序在求第n个素数。( )
对
错
*
4、程序在求第n个素数。( )
对
错
*
5、将第11行的”true”去掉,不改变程序运行结果。( )
对
错
*
6、输入 5,输出( )
A.7
B.10
C.11
D.13
二、
1. #include <iostream>
2. using namespace std;
3. int main() {
4. int n, x;
5. scanf("%d", &n);
6. int a[10];
7. for (int i = 0; i < 10; ++i) a[i] = n;
8. bool ok = true;
9. for (x = 1; ok; ++x) {
10. int y = x;
11. while (y > 0) {
12. if (--a[y % 10] < 0) {cout << x - 1<< endl; ok = false;}
13. y /= 10;
14. }
15. }
16. return 0;
17. }
*
1、将第7行改为”memset(a, n, sizeof(a));” 程序运行结果不变。( )
对
错
*
2、将第12行的”ok=false”改为”break”程序可能会进入死循环。( )
对
错
*
3、程序可能会输出多行。( )
对
错
*
4、将第12行”--a[y%10] < 0”改为”a[y%10]-- < 0”程序运行结果不变。( )
对
错
*
5、程序输入3时,输出( )。
A. 2
B. 3
C. 10
D. 11
*
6、程序输入20是,输出( )
A、20
B、99
C、100
D、101
三、
1. #include <bits/stdc++.h>
2. using namespace std;
3. const int N = 1e5 + 10;
4. int n;
5. int arr[N], reg[N];
6. void sort(int start, int end) {
7. if (start >= end)
8. return;
9. int len = end - start, mid = (len >> 1) + start;
10. int start1 = start, end1 = mid;
11. int start2 = mid + 1, end2 = end;
12. sort(start1, end1);
13. sort(start2, end2);
14. int k = start;
15. while (start1 <= end1 && start2 <= end2)
16. reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
17. while (start1 <= end1)
18. reg[k++] = arr[start1++];
19. while (start2 <= end2)
20. reg[k++] = arr[start2++];
21. for (k = start; k <= end; k++)
22. arr[k] = reg[k];
23. }
24. int main() {
25. cin >> n;
26. for (int i=0; i<n; ++i) cin >> arr[i];
27. sort(0, n-1);
28. for (int i=0; i<n; ++i) cout << arr[i] << " ";
29. return 0;
30. }
*
1、第7行的”>=”改为”>”不会影响程序运行结果。( )
对
错
*
2、第9行改为”int mid=(start+end)/2;”不会影响程序运行结果。( )
对
错
*
3、调换12行和13行代码不会影响程序的运行结果。( )
对
错
*
4、将16行”<”改为”>”与将28行”i=1;i<n;++i”改为”i=n-1;i>=0;--i”的效果是一些的。( )
对
错
*
5、上述代码用的是哪种排序思想?( )
A、冒泡排序
B、选择排序
C、插入排序
D、归并排序
*
6、程序时间复杂度为( )
A、O(n)
B、O(nlogn)
C、O(n2)
D、O(n3)
第III卷(完善程序题)
总共2道大题,每道大题含5道小题,全部为单项选择题。每道单项选择的3分。总共30分。代码中需要完善的部分都是由数字并且有下划线组成。
一、(验证栈序列)给出两个长度都为n的序列 pushed 和 序列poped ,其取值从 1 到 n 。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。
1. #include <bits/stdc++.h>
2. using namespace std;
3. const int N = 100010;
4. int n;
5. int instk[N], outstk[N], intop, outtop;
6. int stk[N], top;
7. int main() {
8. scanf("%d", &n);
9. for (int i = 0; i < n; i++) scanf("%d", &instk[i]);
10. for (int i = 0; i < n; i++) scanf("%d", &outstk[i]);
11. intop = 0;
12.
1
;
13. bool ok = true;
14. for (int i = 0; i < n; ++i) {
15. int x = outstk[i];
16. if (top >= 0 && stk[top] == x)
2
;
17. else {
18. while (
3
) stk[++top] = instk[intop++];
19. if (
4
) {ok = false; break;}
20. else 5 ;
21. }
22. }
23. if (ok) puts("Yes");
24. else puts("No");
25. return 0;
26. }
*
1、①处应填 ( )
A. top = 0
B. top = -1
C. outtop = 0
D. outtop = -1
*
2、②处应填 ( )
A. outstk[outtop++] = x
B. instk[intop++] = x
C. top--
D. intop--
*
3、③处应填 ( )
A. instk[intop] != x
B. instk[intop] == x
C. intop < n && instk[intop] != x
D. instk[intop] != x && intop < n
*
4、④处应填 ( )
A. top > n
B. top >= n
C. intop > n
D. intop >= n
*
5、⑤处应填 ( )
A. intop++
B. outop++
C. top++
D. top--
二、(滑动窗口)给定一个长度为N的整数数组,有一个大小为K的滑动窗口从数组的最左侧移动到数组的最右侧。每次滑动窗口值向右移动一位,输出每个窗口内的最大值。例如8个元素分别为1 3 -1 -3 5 3 6 7,在大小为3的滑动窗口中的最大值分别为3 3 5 5 6 7.
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
提示:通过单调队列来实现,当元素滑入窗口时检查当前元素是否大于等于队尾元素,如果大于等于队尾元素,则队尾元素出队,直到队空或者队尾元素大于当前元素为止,这样队列元素单调递减,最大值就在队头元素,同时每次滑动窗口要检查队头元素是否已经不在窗口里,如果不在,需要队头元素出队。
1. #include <bits/stdc++.h>
2. using namespace std;
3. const int N = 1e5 + 10;
4. int arr[N];
5. int q[N], head = 0, tail = 0;
6. int n, k;
7. int main() {
8. scanf("%d%d", &n, &k);
9. for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
10. for (int i = 0;
1
; ++i) {
11. if (
2
) head++;
12. while (head < tail &&
3
) tail--;
13.
4
;
14. if (
5
) printf("%d ", arr[q[head]]);
15. }
16. return 0;
17. }
*
1、①处应填 ( )
A、i <= n
B、i < n
C、i <= k
D、i < k
*
2、②处应填 ( )
A、i >= k && q[head] == i - k
B、i > k && q[head] == i - k
C、i >= k && q[head] == arr[i-k]
D、i > k && q[head] == arr[i-k]
*
3、③处应填 ( )
A、arr[i] >= q[tail]
B、arr[i] > q[tail-1]
C、arr[i] >= arr[q[tail]]
D、arr[i] >= arr[q[tail-1]]
*
4、④处应填 ( )
A、q[tail++] = i
B、q[++tail] = i
C、q[tail++] = arr[i]
D、q[++tail] = arr[i]
*
5、⑤处应填 ( )
A、i >= k
B、i > k
C、i >= k - 1
D、i > tail
字体大小
CSP-J 练习E卷
复制