CSP-J 初赛模拟卷(第 11 套)
入门级 C++ 语言试题
---
#### **一、单项选择题(共 15 题,每题 2 分,共计 30 分)**
( ) 1. 1TB代表的字节数是( )。
A. 2的10次方 B. 2的20次方 C. 2的30次方 D. 2的40次方
( ) 2. 在 PC 机中,PENTIUM(奔腾)、酷睿、赛扬等是指( )。
A. 生产厂家名称 B. 硬盘的型号 C. CPU 的型号 D. 显示器的型号
( ) 3. 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。
A. 1983 B. 1984 C. 1985 D. 1986
( ) 4. ( )不属于操作系统。
A. Windows B. DOS C. Photoshop D. NOI Linux
( ) 5. FTP 可以用于( )。
A. 远程传输文件 B. 发送电子邮件 C. 浏览网页 D. 网上聊天
( ) 6. 以下不属于无线通信技术的是( )。
A. 蓝牙 B. Wifi C. GPRS D. 以太网
( ) 7. 以下哪个奖项是计算机科学领域的最高奖?( )
A. 图灵奖 B. 鲁班奖 C. 诺贝尔奖 D. 普利策奖
( ) 8. 二进制数101.11对应的十进制数是( )。
A. 6.5 B. 5.5 C. 5.75 D. 5.25
( ) 9. 10 个三好学生名额分配到 7 个班级,每个班级至少有一个名额,一共有( )种不同的分配方案。
A. 84 B. 72 C. 56 D. 504
( ) 10. 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。
A. 296 B. 133 C. 256 D. 199
( ) 11. 甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3门,则不同的选修方案共有( )种。
A. 36 B. 48 C. 96 D. 192
( ) 12. 关于拓扑排序,下面说法正确的是( )。
A. 所有连通的有向图都可以实现拓扑排序
B. 对同一个图而言,拓扑排序的结果是唯一的
C. 拓扑排序中入度为0的结点总会排在入度大于0的结点的前面
D. 拓扑排序结果序列中的第一个结点一定是入度为0的点
( ) 13. 仿生学的问世开辟了独特的科学技术发展道路。人们研究生物体的结构、功能和工作原理,并将这些原理移植于新兴的工程技术中。以下关于仿生学的叙述,错误的是( )。
A. 由研究蝙蝠,发明雷达 B. 由研究蜘蛛网,发明因特网
C. 由研究海豚,发明声呐 D. 由研究电鱼,发明伏特电池
( ) 14. 甲乙丙丁四人在考虑周末要不要外出郊游。
已知①如果周末下雨,并且乙不去,则甲一定不去;②如果乙去,则丁一定去;③如果丙去,则丁一定不去;④如果丁不去,而且甲不去,则丙一定不去。
如果周末丙去了,则甲________,乙________,丁________,周末________。
(1)甲:
A. 去了; B. 没去。
(2)乙:
A. 去了; B. 没去。
(3)丁:
A. 去了; B. 没去。
(4)周末:
A. 下雨; B. 没下雨。
( ) 15. ( )是一种选优搜索法,按选优条件向前搜索,以达到目标。当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。
A. 回溯法 B. 枚举法 C. 动态规划 D. 贪心
---
#### **二、阅读程序(程序输入不超过数组或字符串定义的范围,判断题正确填 √,错误填 ×;共 18 小题,共计 35.5 分,各小题分值见题目)**
**(1)**
```cpp
1 #include
2
3 int n;
4 int a[1000];
5
6 int f(int x)
7 {
8 int ret = 0;
9 for (; x; x &= x - 1) ret++;
10 return ret;
11 }
12
13 int g(int x)
14 {
15 return x & -x;
16 }
17
18 int main()
19 {
20 scanf("%d", &n);
21 for (int i = 0; i < n; i++) scanf("%d", &a[i]);
22 for (int i = 0; i < n; i++)
23 printf("%d ", f(a[i]) + g(a[i]));
24 printf("\n");
25 return 0;
26 }
27
```
**判断题**
( ) 16. (1.5分) 输入的 $n$ 等于1001时,程序不会发生下标越界。( )
( ) 17. (1.5分) 输入的 $a[i]$ 必须全为正整数,否则程序将陷入死循环。( )
( ) 18. (1.5分) 当输入为“5 2 11 9 16 10”时,输出为“3 4 3 17 5”。( )
( ) 19. (1.5分) 当输入为"1 511998"时,输出为"18"。( )
( ) 20. (1.5分) 将源代码中 $g$ 函数的定义(13-16行)移到main函数的后面,程序可以正常编译运行。( )
**单选题**
( ) 21. (3分) 当输入为"2 -65536 2147483647"时,输出为( )
A. "65532 33" B. "65552 32" C. "65535 34" D. "65554 33"
**(2)**
```cpp
1 #include
2 using namespace std;
3 int n, m;
4 int a[100], b[100];
5
6 int main() {
7 scanf("%d%d", &n, &m);
8 for (int i = 1; i <= n; ++i)
9 a[i] = b[i] = 0;
10 for (int i = 1; i <= m; ++i) {
11 int x, y;
12 scanf("%d%d", &x, &y);
13 if (a[x] < y && b[y] < x) {
14 if (a[x] > 0)
15 b[a[x]] = 0;
16 if (b[y] > 0)
17 a[b[y]] = 0;
18 a[x] = y;
19 b[y] = x;
20 }
21 }
22 int ans = 0;
23 for (int i = 1; i <= n; ++i) {
24 if (a[i] == 0)
25 ++ans;
26 if (b[i] == 0)
27 ++ans;
28 }
29 printf("%d", ans);
30 return 0;
31 }
```
假设输入的 $n$ 和 $m$ 都是正整数,$x$ 和 $y$ 都是在 $[1, n]$ 的范围内的整数,完成下面的判断题和单选题:
**判断题**
( ) 22. (1.5分) 当 $m > 0$ 时,输出的值一定小于 $2n$。( )
( ) 23. (1.5分) 执行完第27行的“+ + ans”时,ans一定是偶数。( )
( ) 24. (1.5分) $a[i]$ 和 $b[i]$ 不可能同时大于0。( )
( ) 25. (1.5分) 右程序执行到第13行时, $x$ 总是小于 $y$ ,那么第15行不会被执行。( )
**单选题**
( ) 26. (3分) 若 $m$ 个 $x$ 两两不同,且 $m$ 个 $y$ 两两不同,则输出的值为( )
A. $2n - 2m$ B. $2n + 2$ C. $2n - 2$ D. $2n$
( ) 27. (3分) 若 $m$ 个 $x$ 两两不同,且 $m$ 个 $y$ 都相等,则输出的值为( )
A. $2n - 2$ B. $2n$ C. $2m$ D. $2n - 2m$
**(3)**
```cpp
1 #include
2 #include
3 using namespace std;
4 int n, m;
5 int f[101][101];
6 int F[101][101];
7 int main(){
8 scanf("%d%d",&n,&m);//n的值在1到100之间
9 memset(f,-1,sizeof(f));
10 for(int i = 1; i <= m; i++) {
11 int u,v,w;//w的值在0到10000之间
12 scanf("%d%d%d",&u,&v,&w);
13 f[u][v]=f[v][u]=w;
14 }
15 for(int k = 1; k <= n; k++)
16 for(int i=1;i <=n; i++)
17 for(int j=1;j<= n; j++)
18 if(f[i][k]!=-1&&f[k][j]!=-1)
19 if(f[i][j]==-1||f[i][j]>f[k][j]+f[i][k])
20 f[i][j]=f[i][k]+f[k][j];
21 int ans=2147483647;
22 for(int i=1;i<=n;i++)
23 for(int j=1;j<=n; j++){
24 for(int x=1;x<=n; x++)
25 for(int y=1;y<=n; y++)
26 F[x][y]=f[x][y];
27 F[i][j]=F[j][i]=0;
28 for(int x=1;x<= n; x++)
29 for(int y=1;y<=n; y++)
30 if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y])
31 F[x][y]=F[x][i]+F[i][y];
32 for(int x=1;x<=n; x++)
33 for(int y=1;y<=n; y++)
34 if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y])
35 F[x][y]=F[x][j]+F[j][y];
36 int res=0;
37 for(int x=1;x<=n; x++)
38 for(int y=1;y
2 using namespace std;
3 const int MAXN = 1000;
4 int n, i, lbound, rbound, mid, m, count;
5 int x[MAXN];
6 int main()
7 {
8 cin >> n >> m;
9 for (i = 0; i < n; i++)
10 cin >> x[i];
11 lbound = 0;
12 rbound = m;
13 while (__(1)__)
14 {
15 mid = lbound + (rbound - lbound) / 2;
16 __(2)__;
17 for (i = 0; i < n; i++)
18 if (__(3)__)
19 __(4)__;
20 if (count > n / 2)
21 lbound = mid + 1;
22 else
23 __(5)__;
24 cout << mid << " " << lbound << " " << rbound << " " << count << endl;
25 }
26 cout << rbound << endl;
27 return (0);
28 }
```
( ) 34. (3分) (1)处应填:________________
( ) 35. (3分) (2)处应填:________________
( ) 36. (3分) (3)处应填:________________
( ) 37. (3分) (4)处应填:________________
( ) 38. (2分) (5)处应填:________________
**(2)**
完善程序:
(二又查找树)二又查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子树上所有节点的值。试判断一棵树是否为二叉查找树。输入的第一个行包含一个整数 $n$,表示这棵树有 $n$ 个顶点,编号分别为 $1,2,\dots ,n$,其中编号为1的为根结点。之后的第1行有三个数value, left_child, right_child,分别表示该节点关键字的值、左子节点的编号、右子节点的编号;如果不存在左子节点或右子节点,则用0代替。输出1表示这棵树是二叉查找树,输出0则表示不是。
```cpp
1 #include
2 using namespace std;
3 const int SIZE = 100;
4 const int INFINITE = 1000000;
5 struct node
6 {
7 int left_child, right_child, value;
8 }; node a[SIZE];
9 int is_bst( int root, int lower_bound, int upper_bound )
10 {
11 int cur;
12 if ( root == 0 )
13 return(1);
14 cur = a[root].value;
15 if ( (cur > lower_bound) && ( __(1)__ ) && (is_bst( a[root].left_child, lower_bound, cur ) == 1) && (is_bst( __(2)__, __(3)__, __(4)__ ) == 1) )
16 return(1);
17 return(0);
18 }
19 int main()
20 {
21 int i, n; cin >> n;
22 for ( i = 1; i <= n; i++ )
23 cin >> a[i].value >> a[i].left_child >> a[i].right_child;
24 cout << is_bst( __(5)__, -INFINITE, INFINITE ) << endl;
25 return(0);
26 }
```
( ) 39. (3分) (1)处应填:________________
( ) 40. (3分) (2)处应填:________________
( ) 41. (3分) (3)处应填:________________
( ) 42. (3分) (4)处应填:________________
( ) 43. (2分) (5)处应填:________________