CSP-J 初赛模拟卷(第 06 套)
入门级 C++ 语言试题
---
#### **一、单项选择题(共 15 题,每题 2 分,共计 30 分)**
( ) 1. NOI 的中文意思是( )。
A. 中国信息学联赛 B. 全国青少年信息学奥林匹克竞赛
C. 中国青少年信息学奥林匹克竞赛 D. 中国计算机协会
( ) 2. 1TB代表的字节数是( )。
A. 2的10次方 B. 2的20次方 C. 2的30次方 D. 2的40次方
( ) 3. 二进制数11 1011 1001 0111和01 0110 1110 1011进行逻辑与运算的结果是( )。
A. 01 0010 1000 1011 B. 01 0010 1001 0011
C. 01 0010 1000 0001 D. 01 0010 1000 0011
( ) 4. 如果根结点的深度记为1,则一棵恰有2011个叶结点的二叉树的深度最少是( )。
A. 10 B. 11 C. 12 D. 13
( ) 5. 给定含有 n 个互不相同元素的单峰数组 L,满足先严格递增、后严格递减,峰顶位于数组内部。用下面的二分算法寻找峰顶,请将 a、b、c 三行代码依次填入空白处。正确的填空顺序是( )。
```text
a. return Search(k + 1, r)
b. return Search(l, k - 1)
c. return L[k]
Search(l, r):
if l == r then return L[l]
k = floor((l + r) / 2)
if L[k] > L[k - 1] and L[k] > L[k + 1]: ______
else if L[k] < L[k + 1]: ______
else: ______
调用 Search(2, n - 1)
```
A. c,a,b B. c,b,a C. a,b,c D. b,a,c
( ) 6. 10 个三好学生名额分配到 7 个班级,每个班级至少有一个名额,一共有( )种不同的分配方案。
A. 84 B. 72 C. 56 D. 504
( ) 7. 6 个顶点的连通图的最小生成树,其边数为( )。
A. 6 B. 5 C. 7 D. 4
( ) 8. 设变量x为非负float型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是( )。
A. `x = (x * 100) + 0.5 / 100.0;` B. `x = (x * 100 + 0.5) / 100.0;`
C. `x = (int)(x * 100 + 0.5)/100.0;` D. `x = (x / 100 + 0.5) * 100.0;`
( ) 9. 二进制数 00100100 和 00010100 的和是( )。
A. 00101000 B. 01100111 C. 01000100 D. 00111000
( ) 10. 以下关于字符串的判定语句中正确的是( )。
A. 字符串是一种特殊的线性表 B. 串的长度必须大于零
C. 字符串不可以用数组来表示 D. 空格字符组成的串就是空串
( ) 11. ( )是一种先进先出的线性表。
A. 栈 B. 队列 C. 哈希表(散列表) D. 二叉树
( ) 12. 设 $x=true,y=true,z=false$,以下逻辑运算表达式值为真的是( )。
A. $(y\lor z)\wedge x\wedge z$ B. $x\wedge (z\lor y)\wedge z$ C. $(x\wedge y)\wedge z$ D. $(x\wedge y)\vee (z\vee x)$
( ) 13. 以下哪一种设备属于输出设备( )。
A. 扫描仪 B. 键盘 C. 鼠标 D. 打印机
( ) 14. 在 Windows 资源管理器中,用鼠标右键单击一个文件时,会出现一个名为“复制”的操作选项,它的意思是( )。
A. 用剪切板中的文件替换该文件
B. 在该文件所在文件夹中,将该文件克隆一份
C. 将该文件复制到剪切板,并保留原文件
D. 将该文件复制到剪切板,并删除原文件
( ) 15. 甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3门,则不同的选修方案共有( )种。
A. 36 B. 48 C. 96 D. 192
---
#### **二、阅读程序(程序输入不超过数组或字符串定义的范围,判断题正确填 √,错误填 ×;共 18 小题,共计 39.5 分,各小题分值见题目)**
**(1)**
```cpp
1 #include
2 using namespace std;
3 #define MAXN 20
4 int gu[MAXN][MAXN];
5 int luo(int n, int m) {
6 if(n <= 1 || m < 2)
7 return 1;
8 if(gu[n][m] != -1)
9 return gu[n][m];
10 int ans=0;
11 for(int i = 0; i > n >> m;
19 for(int i = 0; i < MAXN; i++)
20 for(int j = 0; j < MAXN; j++)
21 gu[i][j]= -1;
22 cout << luo(n, m);
23 return 0;
24 }
```
**判断题**
( ) 16. (1分) luo函数中,m的值不可能是奇数。( )
( ) 17. (1分) 若将第11行的“<”改为“<=”,程序的输出结果可能会改变。( )
( ) 18. (2分) 若将第8、9、13行删除,程序的运行的结果不变。( )
( ) 19. (2分) 在添加合适的头文件后,将第19到21行替换为"memset(gu, 255,sizeof(gu));"可以起到相同的作用。( )
**单选题**
( ) 20. (4分) 若输入数据为 4 8,则输出为( )。
A. 7 B. 8 C. 15 D. 16
( ) 21. (3分) 最坏情况下,此程序的时间复杂度是( )。
A. `O(m²n)` B. `O(nm!)` C. `O(n²)` D. `O(n²m)`
**(2)**
```cpp
1 #include
2 using namespace std;
3 int n,m,i,j,p,k;
4 int a[100],b[100];
5 int main()
6 {
7 cin>>n>>m;
8 a[0]=n;i=0;p=0;k=1;
9 do{
10 for(j=0;j
2 #include
3 using namespace std;
4
5 int n;
6 int d[50][2];
7 int ans;
8
9 void dfs(int n, int sum) {
10 if (n == 1) {
11 ans = max(sum, ans);
12 return;
13 }
14 for (int i = 1; i < n; ++i) {
15 int a = d[i - 1][0], b = d[i - 1][1];
16 int x = d[i][0], y = d[i][1];
17 d[i - 1][0] = a + x;
18 d[i - 1][1] = b + y;
19 for (int j = i; j < n - 1; ++j)
20 d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
21 int s = a + x + abs(b - y);
22 dfs(n - 1, sum + s);
23 for (int j = n - 1; j > i; --j)
24 d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
25 d[i - 1][0] = a, d[i - 1][1] = b;
26 d[i][0] = x, d[i][1] = y;
27 }
28 }
29
30 int main() {
31 cin >> n;
32 for (int i = 0; i < n; ++i)
33 cin >> d[i][0];
34 for (int i = 0; i < n;++i)
35 cin >> d[i][1];
36 ans = 0;
37 dfs(n, 0);
38 cout << ans << endl;
39 return 0;
40 }
```
假设输入的 $n$ 是不超过50的正整数,$d[i][0], d[i][i]$ 都是不超过10000的正整数,完成下面的判断题和单选题
**判断题**
( ) 28. (1.5分) 若输入 n 为 0,此程序可能会死循环或发生运行错误。( )
( ) 29. (1.5分) 若输入 $n$ 为20,接下来的输入全为0,则输出为0。( )
( ) 30. (1.5分) 输出的数一定不小于输入的 $d[i][0]$ 和 $d[i][1]$ 的任意一个。( )
**单选题**
( ) 31. (3分) 若输入的 $n$ 为20,接下来的输入是20个9和20个0,则输出为( )。
A. 1890 B. 1881 C. 1908 D. 1917
( ) 32. (3分) 若输入的 $n$ 为30,接下来的输入是30个0和30个5,则输出为( )。
A. 2000 B. 2010 C. 2030 D. 2020
( ) 33. (4分) 若输入的 $n$ 为15,接下来的输入是15到1,以及15到1,则输出为( )。
A. 2440 B. 2220 C. 2240 D. 2420
---
#### **三、完善程序(程序输入不超过数组或字符串定义的范围;共 9 小题,共计 26 分,各小题分值见题目)**
**(1)**
完善程序:
(数字删除)下面程序的功能是将字符串中的数字字符删除后输出。请填空。
```cpp
1 #include
2 using namespace std;
3 int delnum( char *s )
4 {
5 int i, j;
6 j = 0;
7 for ( i = 0; s[i] != '\0'; i++ )
8 if ( s[i] < '0' __(1)__ s[i] > '9' )
9 {
10 s[j] = s[i];
11 __(2)__;
12 }
13 return(__(3)__);
14 }
15 const int SIZE = 30;
16 int main()
17 {
18 char s[SIZE];
19 int len, i;
20 cin.getline( s, sizeof(s) );
21 len = delnum( s );
22 for ( i = 0; i < len; i++ )
23 cout << __(4)__;
24 cout << endl;
25 return 0;
26 }
```
( ) 34. (3分) (1)处应填:________________
( ) 35. (3分) (2)处应填:________________
( ) 36. (3分) (3)处应填:________________
( ) 37. (3分) (4)处应填:________________
**(2)**
对于一个1到 $n$ 的排列 $P$ (即1到 $n$ 中每一个数在 $P$ 中出现了恰好一次),令 $q[i] = \text{第} i$ 个位置之后第一个比 $P[i]$ 值更大的位置,如果不存在这样的位置,则$q[i] = n + 1$ 。举例来说,如果 $n = 5$ 且 $P$ 为15423,则 $q$ 为26656。
```cpp
1 #include
2 using namespace std;
3
4 const int N = 100010;
5 int n;
6 int L[N], R[N], a[N];
7
8 int main() {
9 cin >> n;
10 for (int i = 1; i <= n; ++i) {
11 int x;
12 cin >> x;
13 __(1)__ ;
14 }
15
16 for (int i = 1; i <= n; ++i) {
17 R[i] = __(2)__ ;
18 L[i] = i - 1;
19 }
20
21 for (int i = 1; i <= n; ++i) {
22 L[__(3)__] = L[a[i]];
23 R[L[a[i]]] = R[__(4)__];
24 }
25
26 for (int i = 1; i <= n; ++i) {
27 cout << __(5)__ << " ";
28 }
29
30 cout << endl;
31 return 0;
32 }
```
( ) 38. (3分) (1)处应填:________________
( ) 39. (2分) (2)处应填:________________
( ) 40. (3分) (3)处应填:________________
( ) 41. (3分) (4)处应填:________________
( ) 42. (3分) (5)处应填:________________