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)处应填:________________