- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析 - 补充SVG图示,统一试题排版并导出打印PDF - 重整初赛专题训练与复习资料目录,清理旧版源文件
13 KiB
一、单项选择题(共 15 题,每题 2 分,共计 30 分)
( ) 1. 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。
A. 1983 B. 1984 C. 1985 D. 1986
( ) 2. 一个 32 位整型变量占用( )个字节。
A. 4 B. 8 C. 32 D. 128
( ) 3. 下列四个不同进制的数中,与其它三项数值上不相等的是
A. (269)16 B. (617)10 C. (1151)8 D. (1001101011)2
( ) 4. 根节点深度为0,一棵深度为h的满 k(k > 1) 又树,即除最后一层无任何子节点外,每一层上的所有结点都有 k 个子结点的树,共有( )个结点。
A. $(k^{h + 1} - 1) / (k - 1)$ B. $k^{h - 1}$ C. $k^h$ D. k^{h - 1} / (k - 1)
( ) 5. 若有如下程序段,其中 s,a,b,c 均已定义为整型变量,且 a,c 均已赋值 (c大于 0)。
s = a;
for (b = 1;b <= c; b++ )
s = s + 1;
则与上述程序段修改 s 值的功能等价的赋值语句是( )。
A. s = a + b; B. s = a + c; C. s = s + c; D. s = b + c;
( ) 6. 现有一张分辨率为2048×1024 像素的 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。
A. 16MB B. 4MB C. 8MB D. 2MB
( ) 7. 设简单无向图 G 有 16 条边且每个顶点的度数都是 2,则图 G 有( )个顶点。
A. 10 B. 12 C. 8 D. 16
( ) 8. 要求以下程序的功能是计算:s=1+1/2+1/3+...+1/10.
#include <iostream>
using namespace std;
int main()
{
int n;
float s;
s = 1.0;
for(n = 10; n > 1; n--)
s = s + 1 / n;
cout << s << endl;
return 0;
}
程序运行后输出结果错误,导致错误结果的程序行是( )。
A. s = 1.0; B. for(n = 10; n > 1; n--)
C. s = s + 1 / n; D. cout << s << endl;
( ) 9. 在 8 位二进制补码中,10101011 表示的数是十进制下的( )。
A. 43 B. -85 C. -43 D. -84
( ) 10. 有五副不同颜色的手套(共 10 只手套,每副手套左右手各 1 只),一次性从中取 6 只手套,请问恰好能配成两副手套的不同取法有( )种。
A. 120 B. 180 C. 150 D. 30
( ) 11. 如果根的高度为 1,具有 61 个结点的完全二叉树的高度为( )。
A. 5 B. 6 C. 7 D. 8
( ) 12. 下列几个32位IP地址中,书写错误的是( )。
A. 162.105.135.27 B. 192.168.0.1 C. 256.256.129.1 D. 10.0.0.1
( ) 13. 寄存器是( )的重要组成部分.
A. 硬盘 B. 高速缓存 C. 内存 D. 中央处理器(CPU)
( ) 14. 下列协议中与电子邮件无关的是( )。
A. POP3 B. SMTP C. WTO D. IMAP
( ) 15. 周末小明和爸爸妈妈三个人一起想动手做三道菜。小明负责洗菜、爸爸负责切菜、妈妈负责炒菜。假设做每道菜的顺序都是:先洗菜10分钟,然后切菜10分钟,最后炒菜10分钟。那么做一道菜需要30分钟。注意:两道不同的菜的相同步骤不可以同时进行。例如第一道菜和第二道的菜不能同时洗,也不能同时切。那么做完三道菜的最短时间需要( )分钟。
A. 90 B. 60 C. 50 D. 40
二、阅读程序(程序输入不超过数组或字符串定义的范围,判断题正确填 √,错误填 ×;共 18 小题,共计 37.5 分,各小题分值见题目)
(1)
1 #include <cstdlib>
2 #include <iostream>
3 using namespace std;
4
5 char encoder[26] = {'C','S','P',0};
6 char decoder[26];
7
8 string st;
9
10 int main() {
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
14 for (char x ='A'; x <= 'Z'; ++x) {
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {
18 flag = false;
19 break;
20 }
21 if (flag) {
22 encoder[k]= x;
23 ++k;
24 }
25 }
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
28 cin >> st;
29 for (int i = 0; i < st.length( ); ++i)
30 st[i] = decoder[st[i] -'A'];
31 cout << st;
32 return 0;
33 }
判断题
( ) 16. (1.5分) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
( ) 17. (1.5分) 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。( )
( ) 18. (1.5分) 将第 12 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )
( ) 19. (1.5分) 将第 26 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )
单选题
( ) 20. (3分) 若输出的字符串为 ABCABCABCA,则下列说法正确的是( )。
A. 输入的字符串中既有 S 又有 P B. 输入的字符串中既有 S 又有 B
C. 输入的字符串中既有 A 又有 P D. 输入的字符串中既有 A 又有 B
( ) 21. (3分) 若输出的字符串为 CSPCSPCSPCSP,则下列说法正确的是( )。
A. 输入的字符串中既有 P 又有 A B. 输入的字符串中既有 S 又有 R
C. 输入的字符串中既有 A 又有 S D. 输入的字符串中既无 S 又无 A
(2)
1 #include <cstdio>
2 using namespace std;
3 int n;
4 int a[100];
5
6 int main() {
7 scanf("%d", &n);
8 for (int i = 1; i <= n; ++i)
9 scanf("%d", &a[i]);
10 int ans = 1;
11 for (int i = 1; i <= n; ++i) {
12 if (i > 1 && a[i] < a[i - 1])
13 ans = i;
14 while (ans < n && a[i] >= a[ans + 1])
15 ++ans;
16 printf("%d\n", ans);
17 }
18 return 0;
19 }
判断题
( ) 22. (1分) 第16行输出ans时,ans的值一定大于i。( )
( ) 23. (1分) 程序输出的ans小于等于n。( )
( ) 24. (1.5分) 若将第12行的 < 改为 != ,程序输出的结果不会改变。( )
( ) 25. (1.5分) 当程序执行到第16行时,若ans-i>2,则 a[i+1]\leq a[i] 。( )
单选题
( ) 26. (3分) 若输入的a数组是一个严格单调递增的数列,此程序的时间复杂度( )
A. O(log n) B. O(n^2) C. O(n log n) D. O(n)
( ) 27. (4分) 最坏情况下,此程序的时间复杂度是( )
A. O(n^2) B. O(log n) C. O(n) D. O(n log n)
(3)
1 #include <iostream>
2 using namespace std;
3 const int V = 101;
4 int n, m, ans, e[V][V];
5 bool visited[V];
6 void dfs(int x, int len)
7 {
8 int i;
9 visited[x] = true;
10 if (len > ans) ans = len;
11 for (i = 1; i <= n; i++)
12 if ((!visited[i]) && (e[x][i] != -1))
13 dfs(i, len + e[x][i]);
14 visited[x] = false;
15 }
16 int main()
17 {
18 int i, j, a, b, c;
19 cin >> n >> m;
20 for (i = 1; i <= n; i++)
21 for (j = 1; j <= n; j++)
22 e[i][j] = -1;
23 for (i = 1; i <= m; i++) {
24 cin >> a >> b >> c;
25 e[a][b] = c;
26 e[b][a] = c;
27 }
28 for (i = 1; i <= n; i++)
29 visited[i] = false;
30 ans = 0;
31 for (i = 1; i <= n; i++)
32 dfs(i, 0);
33 cout << ans << endl;
34 return 0;
35 }
输入表示一个没有重边、自环的无向图,顶点编号为 1 到 $n$,且 $1\le n\le100$、边权为正整数。
判断题
( ) 28. (1.5分) 第 19 行的输入中,如果满足 $m=n(n-1)/2$,则第 20~22 行的初始化可以省略。( )
( ) 29. (1.5分) 将第 31 行改为 for (i = n; i >= 1; i--),程序结果不受影响。( )
单选题
( ) 30. (1.5分) 若输入如下,则程序输出为( )。
4 2
1 2 1
3 4 1
A. 8 B. 4 C. 2 D. 1
( ) 31. (3分) 若输入如下,则程序输出为( )。
4 6
1 2 1
2 3 1
3 4 1
4 1 1
1 3 1
2 4 1
A. 1 B. 3 C. 5 D. 7
( ) 32. (3分) 若输入如下,则程序输出为( )。
4 3
1 2 10
2 3 20
3 1 30
A. 30 B. 50 C. 90 D. 120
( ) 33. (3分) 若输入如下,则程序输出为( )。
4 6
1 2 10
2 3 20
3 4 30
4 1 40
1 3 50
2 4 60
A. 60 B. 100 C. 150 D. 200
三、完善程序(程序输入不超过数组或字符串定义的范围;共 10 小题,共计 31 分,各小题分值见题目)
(1)
(最小区间覆盖)给出 n 个区间,第 i 个区间的左右端点是 $[a_i, b_i]$。现在要在这些区间中选出若干个,使得区间 [0, m] 被所选区间的并覆盖(即每一个 0 \leq i \leq m 部在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。
输入第一行包含两个整数 n 和 m ($1 \leq n \leq 5000, 1 \leq m \leq 10^3$)接下来 n 行,每行两个整数 $a_i, b_i (0 \leq a_i, b_i \leq m)$。提示:使用贪心法解决这个问题。先用 O(n^2) 的时间复杂度排序,然后贪心选择这些区间。试补全程序。
1 #include <iostream>
2
3 using namespace std;
4
5 const int MAXN = 5000;
6 int n, m;
7 struct segment { int a, b; } A[MAXN];
8
9 void sort() // 排序
10 {
11 for (int i = 0; i < n; i++)
12 for (int j = 1; j < n; j++)
13 if (__(1)__)
14 {
15 segment t = A[j];
16 __(2)__
17 }
18 }
19
20 int main()
21 {
22 cin >> n >> m;
23 for (int i = 0; i < n; i++)
24 cin >> A[i].a >> A[i].b;
25 sort();
26 int p = 1;
27 for (int i = 1; i < n; i++)
28 if (__(3)__)
29 A[p++] = A[i];
30 n = p;
31 int ans =0, r = 0;
32 int q = 0;
33 while (r < m)
34 {
35 while (__(4)__)
36 q++;
37 __(5)__;
38 ans++;
39 }
40 cout << ans << endl;
41 return 0;
42 }
( ) 34. (3分) (1)处应填
A. A[j].b>A[j-1].b B. A[j].a<A[j-1].a
C. A[j].a>A[j-1].a D. A[j].b<A[j-1].b
( ) 35. (3分) (2)处应填
A. A[j+1]=A[j];A[j]=t; B. A[j-1]=A[j];A[j]=t;
C. A[j]=A[j+1];A[j+1]=t; D. A[j]=A[j-1];A[j-1]=t;
( ) 36. (3分) (3)处应填
A. A[i].b>A[p-1].b B. A[i].b<A[i-1].b
C. A[i].b>A[i-1].b D. A[i].b<A[p-1].b
( ) 37. (3分) (4)处应填
A. q+1<n&&A[q+1].a<=r B. q+1<n&&A[q+1].b<=r
C. q<n&&A[q].a<=r D. q<n&&A[q].b<=r
( ) 38. (3分) (5)处应填
A. r=max(r,A[q+1].b) B. r=max(r,A[q].b)
C. r=max(r,A[q+1].a) D. q++
(2)
完善程序:
(最大子矩阵和)给出 m 行 n 列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。
输入第一行包含两个整数 m 和 n ,即矩阵的行数和列数。之后 m 行,每行 n 个整数,描述整个矩阵。程序最终输出最大的子矩阵和。比如在如下这个矩阵中:
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
拥有最大和的子矩阵为:
9 2
-4 1
-1 8
其和为15
3 3
-2 10 20
-1 100 -2
0 -2 -3
最大子矩阵和为128
4 4
0 -2 -9 -9
-9 11 5 7
-4 -3 -7 -6
-1 7 7 5
最大子矩阵和为26
1 #include <iostream>
2 using namespace std;
3 const int SIZE = 100;
4 int matrix[SIZE + 1][SIZE + 1];
5 int rowsum[SIZE + 1][SIZE + 1]; /* rowsum[i][j]记录第i行前j个数的和 */
6 int m, n, i, j, first, last, area, ans;
7 int main()
8 {
9 cin >> m >> n;
10 for ( i = 1; i <= m; i++ )
11 for ( j = 1; j <= n; j++ )
12 cin >> matrix[i][j];
13 ans = matrix __(1)__;
14 for ( i = 1; i <= m; i++ )
15 __(2)__;
16 for ( i = 1; i <= m; i++ )
17 for ( j = 1; j <= n; j++ )
18 rowsum[i][j] = __(3)__;
19 for ( first = 1; first <= n; first++ )
20 for ( last = first; last <= n; last++ )
21 {
22 __(4)__;
23 for ( i = 1; i <= m; i++ )
24 {
25 area += __(5)__;
26 if ( area > ans )
27 ans = area;
28 if ( area < 0 )
29 area = 0;
30 }
31 }
32 cout << ans << endl;
33 return(0);
34 }
( ) 39. (3分) (1)处应填:________________
( ) 40. (3分) (2)处应填:________________
( ) 41. (3分) (3)处应填:________________
( ) 42. (3分) (4)处应填:________________
( ) 43. (4分) (5)处应填:________________