乐于分享
好东西不私藏

2026年CSP-J初赛模拟题及解析

2026年CSP-J初赛模拟题及解析

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个 正确选项)

  1. 每个不同的二进制数可以表示一位学生,现要用二进制数来表示 1200 位学生,至少需要二进制数的位数是( )   A.11 B. 10 C. 12 D.13
  2. 若有如下程序段,其中 s、x、y、z 均已定义为int 类型变量,且 x、z 均已赋值(z大于0)。则与下面程序段修改 s 值的功能等价的赋 值语句是( )。
    s = X;for(y=z;y>= 1;y--){    s=s + 1;}  
       A. s = y + z; B. s = x + y; C. s = s + z; D.s = x + z;
  3. 已知有序表(13,18,24,35,47,50,62,83,90,115,134),当折半查 找值为90的元素时,查找成功的比较次数为( )。
       A.4   B. 5 C. 3 D.2
  4. 已知大写字母 A 的 ASCII 编码为 65(十进制),则大写字母 J 的 十进制 ASCII 编码为(   )   A.71 B. 72 C. 73 D.74
  5. 设x=true ,y=true ,z=false ,以下逻辑表达式值为真的是( )。   A.(x ∨ y) Λ z            B. x Λ (z ∨ y) Λ z
       C.(x ∨ y) Λ (x ∨ z)    D.(y ∨ z) Λ x Λ z
  6. 一个二叉搜索树前序遍历的结果为 7、2、1、5、13、9 ,这棵树 的根的左子树有多少个节点?()。   A.2 B. 5 C. 4 D.3
  7. 某算法计算时间表示为递推关系式:T (N) = N + T( N/2 ),则该算法时 间复杂度为( )。   A.$O(N^2 )$ B. $O(Nlog N )$ C. $O(N ) $ $D.O(1) $
  8. 共9个互不相同的数,它们的最大公约数是2021 的一个大于1的因 子(6有2、3、6这三个大于1的因子,因子可以包含自身),且这9个数 的和小于等于2021,则这9个数的和是多少?( )   A.1849 B. 1935 C. 2021 D.1927
  9. 一个 n 个顶点的强连通图最少有几条边( )。   A.n B. n + 1 C. n − 1 D. n × (n − 1)
  10. 小帅计划展出 10 幅不同的画,其中 1 幅水彩画、4 幅油画、5 幅 国画,排成一行陈列,要求同一品种的画必须连在一起,并且水彩画不放在两端,那么不同的陈列方式有( )种。     A.5760 B. 2880 C. 17280 D.8640
  11. 在一个图中,所有顶点的度数之和等于所有边数的( )倍。      A.2 B. 4 C. 1 D.3
  12. 6个人分乘两辆不同的汽车,每辆车最多坐 4人,则不同的乘车方法数为( )。      A.40 B. 50 C. 70 D.60
  13. 设 G 是有 6 个结点的完全图,要得到一棵生成树,需要从 G 中删 去( )条边。      A.6 B. 9 C. 10 D.15
  14. 8颗子弹,编号为 1、2、3、4、5、6、7、8,从编号 1 开始按序嵌入弹夹,以下有哪个不是正常的打出子弹的次序( )      A.87654321 B. 32154876 C. 32164587 D.12345678
  15. 某公司派赵钱孙李周五人出国学习,选派条件是:      若赵去,钱也去;
          李、周两人必有一人去;      如周去,则赵、钱也同去;      孙李二人同去或同不去 如何选他们出国?( )      A.孙赵周去 B. 李周孙去 C.赵钱周去 D.钱孙去

二、阅读程序(程序输入不超过数组或字符串定义的 范围;判断题正 确填 T,错误填 F;除特殊说明外, 判断题1.5 分,选择题 3 分,共 计 40 分)

阅读下面程序,完成第16~21题。

#include#includeusing namespace std;intmain(){  int t[256];  char s[10];  int i;  scanf(”%s”, s);  for (i = 0; i < 256; i++) t[i] = 0;  for (i = 0; i < strlen(s); i++) t[s[i]]++;  for (i = 0; i < strlen(s); i++)  if (t[s[i]] == 1) {    cout << s[i] << endl;    return 0;  }  cout << ”no” << endl;  return 0;}
  1. 程序会将读入的字符串中出现次数等于 1 的字符依次输出。( )
  2. 将程序中的 for (i = 0; i < 256; i++) t[i] = 0; 删掉可能会影响程序 的正确性。( )
  3. 当程序读入字符串的内容是 "xyzxyw" 时,程序的输出结果是 w 。 ( )
  4. 对于一组输入数据 "abc?ac" ,如果希望程序的输出结果为 b ,则 ? 处应替换为 b 。( )
  5. 若输入的字符串中 a 到 g 这 7 种字符均至少出现一次,如果希望输出结果为 no ,则输入的字符串长度至少为14。( )
  6. 这个程序最多正确输入并处理长度为( )的字符串 s 。

A.256 B. 10 C. 9 D.11

阅读下面程序,完成第 22~27 题

#includeusing namespace std;const int MAXN = 100;int arr[MAXN];boolBinarysearch(int n, int target){  int left=0, right=n-1;  while (left <= right) {  int middle = (left + right) / 2;  if(arr[middle]> n;  for (int i=0; i>arr[i];  sort(arr,arr+n);//(1)将arr数组中的元素从小到大排序  cin>> m;  for (int i= 0; i < m; i++) {    int target;    cin>>target;    if(Binarysearch(n,target))      cout<<”YEs”<<endl;    else cout<<”No”<<endl;  }  return 0;}

22.该算法的时间复杂度是 O(mlog n )。(不考虑(1)的排序)( )。

23.将 while (left <= right) 改成 while(left < right) ,其他地方不做 改动,对程序最终的输出结果没有影响。( )

24.将 sort(arr, arr + n); 改成把 arr 数组中的元素从大到小排序的代码, 其他地方不做改动,对程序最终的输出结果没有影响。( )

25.将 int middle = (left + right) / 2; 改成下列选项中的哪一项,对 于程序的运行没有影响。( )

A.int middle = (left + right) >> 1;

B. int middle = (left + right) << 1;

C. int middle = (left + right) > 1;

D.int middle = (left + right) < 1;

26.若给定 n 和 arr 数组,在最好情况下,函数 BinarySearch 中的 while 循环需要被执行( )次。

A.n B. m C. m×⌈log_2 n⌉ $ D.$m×⌊log_2 n⌋ $

27.(4分)若输入如下数据:

5

1 5 2 4 3

3

2 5 6

则输出结果为(用空格表示换行):( )。

A.YES YES YES B. YES NO YES C. YES YES NO D.NO NO NO

阅读下面程序,完成第 28~33 题。

#includeusing namespace std;int w[35000],d[35000],dp[35000];intmain(){  int n, m;  scanf(”%d%d”, &n, &m);  for (int i = 1; i <= n; i++)  scanf(”%d%d”, &w[i], &d[i]);  for (int i = 1; i <= n; i++) {    for (int j = m; j >= w[i]; j--) {      dp[j] = max(dp[j],dp[j-w[i]] + d[i]);    }  }  printf(”%d\n”, dp[m]);  return 0;}
  1. 上述代码中,双重循环里循环变量 j 的枚举顺序改为从 w[i] 到 m, 输出结果一定不变。( )
  2. 上述代码中,双重循环中变量 i 的枚举顺序改为从 n 到 1,输出结 果一定不变。( )
  3. 若输入数据中,1≤n≤30000, 1≤m≤30000, 1≤w[i]≤30000, 1≤d[i] ≤30000,则所求答案一定没有溢出。( )
  4. 当输入为:

4 6

1 4

2 6

3 12

2 7

输出为( )

A.17 B.28 C.29 D.23

  1. (4分)若输入数据中,1 ≤ n ≤ 30000, 1 ≤ m ≤ 30000, 1 ≤ w[i] ≤ 30000,下列给出的 d[i]的范围,哪个选项所求答案有可能会超出 INT 的范围( )    A.1 ≤ d[i] ≤ 100        B. 1 ≤ d[i] ≤ 1000
        C. 1 ≤ d[i] ≤ 10000 D.1 ≤ d[i] ≤ 100000
  2. 上述代码的时间复杂度为( )    A.O(n) B. $O(n^2m)$ C. O(nm) D.$O(nm^2 ) $

三、完善程序(单选题,每小题3分,共计30分)

阅读下面题目,完成第 3438 题。

题目描述

在二维平面内有若干个点,每个点的视野价值定义为其左下方的点的数目,即$ val_i=∑_j[x_j<x_i]and[y_j < y_i]$,求出每个点的视野价值并输出最具有视野价值的点的编号,如果有多个这样的点,输出其中最大的编号。

输入说明:

第一行一个正整数 n ,表示二维平面中点的个数。 接下来 n 行,每行两个数,表示编号为 i 的点的坐标。

输出说明 :

第一行 n 个正整数,表示编号为 i 的点的视野价值。 第二行一个正整数,表示视野价值最高的点的编号,如果有多个视野价值相同的点,则输出编号最大的那个。

样例输入

52 33 21 13 55 3

样例输出1 1 0 2 25

请补全下面的代码。

#includeusing namespace std;const int N=100;int x[N],y[N],f[N],n, max_f, ans;intmain() {    cin >> n;    for (int i=1; i<=n; i++) cin>>x[i]>>y[i];    for (int i=1;i<= n; i++) {        f[i]= ①;        for (int j= 1; j <= n; j++) {            if(x[j]<x[i]&&②)                ③;        }        if(④){            max_f = f[i];            ⑤;        }    }    for(int i=1;i<=n; i++) cout<<f[i]<< ” ”;    cout << endl<< ans << endl;    return 0;}

34.①处应填( )

A.0 B. 1 C. i D.INT_MAX

35.②处应填( )

A.y[j]<=y[i] B. y[j]y[i] D.y[j]>=y[i]

36.③处应填( )

A.ans=i B. f[i]++ C.f[i]-- D.ans++

37.④处应填( )

A.(f[0]>max_f)    B. (f[i]>=max_f)

C.(f[i]<max_f)    D.(f[i]<=max_f)

38.⑤处应填( )A

A.ans++ B. ans+=max_f C. ans=i D.ans= max_f

阅读下面题目,完成第 39~43 题。

题目描述

小帅的幼儿园有 n 个小朋友,在一次升旗仪式中,共有 n 个可以上场的小朋友,现在共需要 m 个小朋友来组成仪仗队,请你列举出所有可能的仪仗队,并按照字典序进行输出。

输入说明输入共一行,两个正整数 n, m,分别表示能上场的小朋友的数目和仪仗队的人数。

输出说明输出有若干行,每一行有 m 个数,表示一种可能的仪仗队组成形式, 并按照字典序输出。

样例输入3 2

样例输出

1 21 32 12 33 13 2

请补全下面的代码

#include    using namespace std;    const int N = 25;    int n, m,data[N];    bool flag,used[N];    intmain(){    	cin>>n>>m;    	memset(used, falsesizeof(used));    	for (int i = 1; i <= m; ++i) {    		data[i] = i;    		used[i]= true;    	}    	flag = true;    	while (flag) {    		for (int i = 1; i <= m - 1; i++) cout <= 1; i--){    			②    			for (int j= data[i] + 1; j <= n; j++) {    				if (!used[j]) {    					used[j] = true;    					data[i]=③;    					flag = true;    					break;    				}    			}    			if (flag){    				for (int k=i+ 1;k <= m; k++){    					for (int j= 1; j <= ④; j++) {    						if (!used[i]){    							data[k]=j;    							used[j]=true;    							break;    						}    					}    				}    				⑤;    			}    		}    	}    	return 0;    }

39.① 处应填( )A.false B. true C. 1 D.-1

40.② 处应填( )A.used[i]= true B. data[i]=i C. used[data[i]]= true D.used[data[i]]= false

41.③ 处应填( )A.j B. i C.true D.false

42.④ 处应填( )A.n B. m C. i D.j

43.⑤ 处应填( )A.return 0 B. exit C. continue D.break

答案速览

1~5  ADDDC 6~10 DCBAA11~15 ABCCC 16~20 FTFFT21~25 CTFFA

26~30 BCFTT 31~35 DDCAB 36~40 BBCAD 41~43 AAD

解析部分:

模拟1

  1. A。2 10 < 1200 < 2 11
  2. D。考察程序设计基础知识。先将 s 赋值为 x ;再循环 z 次, 每次给 s 累加 1,相当于给 s 一共累加了 z。总体看来,是将 s 赋值为 x + z。
  3. D。第一次比较的元素为 50,第二次比较的元素为 90。
  4. D。ASCII 计算。
  5. C。x∣∣y = true, x∣∣z == true, true&&true = true。
  6. D。二叉搜索树根节点的左子树中所有节点的权值小于根节点 的权值,前序遍历序列的第一个节点为根节点,故左子树的大 小为 3。 + + ... = N(1 + + + ...) = 2N 向上选 nlogn
  7. C 。$T(N) = N +N/2+N/4+……=N(1+1/2+1/4+……)=2N$,时间复杂度去掉系数。
  8. B。2021 有两个因数: 43 和 47,由最大公约数的性质可知, 若其因数为 x ,则和最小的 9 个数字为: x, 2x, 3x, 4x, 5x, 6x, 7x, 8x, 9x。代入运算可知答案为 1935。
  9. A。边数最少的强连通图即形成一个环的时候。此时边数最小, 为 n。
  10. A。因为同一品种的画只能放在一起,所以如果将所有同类型 的画先视为相同,有 2 种摆放方式, 在考虑每一个类型内部 的顺序,分别为, 1!, 4!, 5! 所以答案为:2*1! *4! *5! = 5760。
  11. A。每一条边都会使得两个点的度数加一,所以度数和是边数 的两倍。
  12. B。1).分配方式一:2人+4人    从6人中选2人坐第一辆车,剩余4人自然坐第二辆车:方法数为$C_6^2$。    由于两辆车不同,“第一辆2人、第二辆4人"与“第一辆4人、第二辆2人"是两种不同方案,因此需乘以2·计算:2x$C_6^2$=2x15=30。    2).分配方式二:3人+3人    ·从6人中选3人坐第一辆车,剩余3人坐第二辆车:方法数为$C_6^3$。    注意:此时“第一辆3人、第二辆3人”与“第一辆3人、第二辆3人”是同一种分配(因为交换后人数不变),因此无需乘以2。    计算:$C_6^3$=20.
  13. C。完全图具(5*6)/2=15 条边,树有 6−1=5 条边,所以需。要删去 15−5=10 条边就可以得到一颗生成树。
  14. C。嵌入弹夹相当于入栈,打出子弹相当于出栈。
  15. C。使用排除法。孙赵去或赵钱周去。
  16. F。程序会将读入的字符串中出现次数等于 1 的第一个字符
  17. T。如果删掉这部分语句的话,会导致数组 t 中的元素不一定 初始化为 0,导致最终结果出错。
  18. F。
  19. F。
  20. T。最短的符合要求的字符串为 a 到 g 每个字符出现两次,总 长度为 7 × 2 = 14。
  21. C。【个人认为选B】数组 s 的长度为 10,最后一位需要保存 \0 ,因此数组 s 能正确输入并处理的最大长度为 10 − 1 = 9。
  22. T。代码显然是二分查找。
  23. F。有 left == right 时恰好是关键字所在位置这一情况。
  24. F。如果是从大到小排序,15 行和 17 行的两个 if 语句也要反 过来。
  25. A。考察位运算基本知识。
  26. B。每次进循环第一次就找到,所以是总共 m 次。
  27. C。查找序列中是否含有带查询元素。
  28. F。若更改则变为完全背包,显然不正确。
  29. T。容易知道物品的枚举顺序没有影响。
  30. T。30000*30000<=INT_MAX ,不会溢出。
  31. D。
  32. D。判断方法同上。
  33. C。复杂度上限决定于枚举物品及体积的循环,易知答案为 O(nm)。

34~38 题 通过枚举的方式计算每个点的视野价值,并且将每个点的视野价值与全局最大值进行判断。要注意的是题目中提出了在视野价值相 同的情况下选择编号大的点,所以代码中是从小到大枚举点,并 在 f[i] 与 max_f 相等时也进行答案的更新。

  1. A。
  2. B。
  3. B。
  4. B。
  5. C。

39~43 题 这段代码的主要原理是通过一个已经有的排列,推断出该排列在字典序中的下一个排列。操作方法很简单:假设当前排列中 的第 i 个的值为 data[i] ,那么就倒着寻找第一个可以使 data[i]变大的下标, 设为k,令 data[k] 变成一个更大的数字,这样就可以使得字典序增大。同时为了保证这是在字典序上直接与当前排 列相邻的排列,我们需要让 data[k+1..m] 这部分构成的序列字典序最小(在不修改 data[1..k-1] 的情况下)。所以我们需要重新对其值进行分配,也就是代码中 if(flag) 分支的部分。

  1. A。
  2. D。
  3. A。
  4. A。
  5. D。