Files
cpp-courseware/2.Course/5.C++_Exam/NOI/CSP-J 初赛模拟卷/试题/CSP-J初赛模拟卷·第06套.md
T
xiaolinquan 0af92a68d9 整理 NOI 初赛资料目录并标准化 CSP-J 模拟卷
- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析
- 补充SVG图示,统一试题排版并导出打印PDF
- 重整初赛专题训练与复习资料目录,清理旧版源文件
2026-11-06 17:50:51 +08:00

10 KiB
Raw Blame History

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 三行代码依次填入空白处。正确的填空顺序是( )。

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)

 1  #include<iostream>
 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 <m; i += 2)
12          ans+=luo(n-1, i);
13      gu[n][m] = ans;
14      return ans;
15  }
16  int main() {
17      int n, m;
18      cin >> 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)

 1  #include<iostream>
 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<i;j++)
11              if(a[i]==a[j])
12              {
13                  p=1;k=j;break;
14              }
15          if(p) break;
16          b[i]=a[i]/m;
17          a[i+1]=a[i]%m*10;
18          i++;
19      }while(a[i]!=0);
20      cout<<b[0]<<".";
21      for(j=1;j<k;j++) cout<<b[j];
22      if(p) cout<<"(";
23      for(j=k;j<i;j++) cout<<b[j];
24      if(p) cout<<") ";
25      cout<<endl;
26      return 0;
27  }

判断题

( ) 22. (1.5分) 程序输入的n和m不能相等。( )

( ) 23. (1.5分) 程序输入的m不能等于0。( )

( ) 24. (1.5分) 第9~19行的do...while循环一共有2个出口。( )

( ) 25. (1.5分) 数组a和b中的数值都小于或等于n。( )

单选题

( ) 26. (3分) 若输入数据为“11 8”,则输出结果为( )
A. 0.375  B. 0.(375)  C. 1.375  D. 1.(375)

( ) 27. (3分) 若输入数据为“5 13”,则输出结果为( )。
A. 0.386514  B. 0.(386514)  C. 0.384615  D. 0.(384615)

(3)

 1  #include <algorithm>
 2  #include <iostream>
 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)

完善程序: (数字删除)下面程序的功能是将字符串中的数字字符删除后输出。请填空。

 1  #include <iostream>
 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。

 1  #include <iostream>
 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)处应填:________________