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