整理 NOI 初赛资料目录并标准化 CSP-J 模拟卷

- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析
- 补充SVG图示,统一试题排版并导出打印PDF
- 重整初赛专题训练与复习资料目录,清理旧版源文件
This commit is contained in:
xiaolinquan committed 2026-11-06 17:50:51 +08:00
1 parent fe5c7ffd58
commit 0af92a68d9
216 files changed
+12743 -1272

No files matched your search

@@ -0,0 +1,442 @@
<center><font size="6"><b>CSP-J 初赛模拟卷(第 05 套)</b></font></center>
<center><font size="4"><b>入门级 C++ 语言试题</b></font></center>
---
#### **一、单项选择题(共 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.
```cpp
#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)**
```cpp
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)**
```cpp
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)**
```cpp
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分) 若输入如下,则程序输出为( )。
```text
4 2
1 2 1
3 4 1
```
A. 8  B. 4  C. 2  D. 1
( ) 31. (3分) 若输入如下,则程序输出为( )。
```text
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分) 若输入如下,则程序输出为( )。
```text
4 3
1 2 10
2 3 20
3 1 30
```
A. 30  B. 50  C. 90  D. 120
( ) 33. (3分) 若输入如下,则程序输出为( )。
```text
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)$ 的时间复杂度排序,然后贪心选择这些区间。试补全程序。
```cpp
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
```cpp
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)处应填:________________