#180. CSP-J 2026 初赛模拟卷 7
CSP-J 2026 初赛模拟卷 7
CSP-J 2026 初赛模拟卷 7 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 计算机内存中的每一个基本单元,都被赋予一个唯一的序号,称为( )。 {{ select(1) }}
字节
编号
容量
地址
计算 ( A B C D E F ) 16 + ( F E D C B A ) 16 (ABCDEF) 16 +(FEDCBA) 16 的二进制结果是( )。 {{ select(2) }}
( 11010101010101010101001 ) 2 (11010101010101010101001) 2
( 10010101010101010101001 ) 2 (10010101010101010101001) 2
( 11010101010101110101001 ) 2 (11010101010101110101001) 2
( 10010111010101010101001 ) 2 (10010111010101010101001) 2
十进制数-67的八位二进制补码是( )。 {{ select(3) }}
( 10111100 ) 2 (10111100) 2
( 10111101 ) 2 (10111101) 2
( 11000011 ) 2 (11000011) 2
( 11000010 ) 2 (11000010) 2
12张扑克牌,分别为黑桃、红心、梅花、方块的J、Q、K。从中抽取三张牌,如果有对子就能获胜;如果没有对子,有黑桃K也能获胜。获胜的概率是( )。 {{ select(4) }}
43/55
4/5
97/110
46/55
一个链表的节点定义为:struct node {int data; node* next;}; 该链表中的data的数值从小到大排列。现在想在这个链表中插入一个新的节点,其成员data的值为20。为了依旧满足链表从小到大的顺序,定位到需将新节点插入至指针node* a指向的节点的后面。正确的操作指令是( )。 {{ select(5) }}
node* newnode; newnode->data = 20; newnode->next = a->next; a->next = newnode;
node* newnode; a->data = 20; a->next = newnode;
node* newnode; newnode->data = 20; a->data = newnode->data;
node* newnode; a->next = newnode; newnode->next = a->next;
算24点游戏指的是用给出的四个数字结合加、减、乘、除运算凑出24。用1,4,5,6算24点,下列后缀表达式中正确的是( )。 {{ select(6) }}
1 5 6 - / 4 /
5 6 / 1 - 4 /
4 1 5 6 - / /
4 1 5 6 - - /
在 C++ 语言中,char K = (char)('J' - 7),那么变量K代表的字母是( )。 {{ select(7) }}
'B'
'C'
'D'
'K'
字符 A ∼ F A∼F 的出现频率分别为 0.04, 0.09, 0.11, 0.12, 0.15, 0.49,则这些字符所对应的哈夫曼编码可能为( )。 {{ select(8) }}
0, 110, 111, 1110, 1011, 11
1, 0, 10, 11, 1, 1
0001, 0000, 010, 011, 001, 1
0, 0110, 111, 1110, 1011, 011
下列选项中( )是操作系统的名字。 {{ select(9) }}
CJYYDS
Safari
Android
无向图 G
( V , E ) G=(V,E),顶点集合 V
{ a , b , c , d , e , f , g } V={a,b,c,d,e,f,g},边集 E
{ ( a , b ) , ( a , c ) , ( b , d ) , ( c , d ) , ( d , e ) , ( d , f ) , ( e , g ) , ( f , g ) } E={(a,b),(a,c),(b,d),(c,d),(d,e),(d,f),(e,g),(f,g)},从顶点 a a 开始进行深度优先搜索,不能得到的顶点序列是( )。 {{ select(10) }}
a c d e g f b acdegfb
a b d c f g e abdcfge
a b c d e f g abcdefg
a b d f g e c abdfgec
给定二叉树的前序遍历序列为 [ a , b , c , d , f , g , h , i , e ] [a,b,c,d,f,g,h,i,e],中序遍历序列为 [ b , a , f , d , h , g , i , c , e ] [b,a,f,d,h,g,i,c,e],该二叉树的后序遍历的结果是( )。 {{ select(11) }}
[ b , f , h , i , g , d , e , c , a ] [b,f,h,i,g,d,e,c,a]
[ b , f , g , h , i , d , e , c , a ] [b,f,g,h,i,d,e,c,a]
[ f , h , i , g , d , e , c , b , a ] [f,h,i,g,d,e,c,b,a]
[ f , h , i , g , d , c , b , e , a ] [f,h,i,g,d,c,b,e,a]
现在有一个整数序列是5,17,28,96,13,15,要对其进行排序。
第一次排序后:5,17,28,13,15,96。
第二次排序后:5,17,13,15,28,96。
第三次排序后:5,13,15,17,28,96。
根据上面前三次的排序情况,使用的排序算法可能是( )。 {{ select(12) }}
冒泡排序
希尔排序
归并排序
计数排序
以下算法描述正确的是( )。 {{ select(13) }}
算法的时间复杂度是指执行算法程序所需要的时间
算法必须能在执行有限个步骤之后结束
设计算法时只需要考虑数据结构的选择和结果的准确性
算法的空间复杂度是指算法程序中指令(或语句)的条数
小明的团队中只有10个成员(算上小明),他讨厌其中的两个人,又喜欢其中的三个人。明天小明就要出差了,他可以带任意多个团队成员一起去,也可以自己一个人去。他不想和他讨厌的人出差,也不想让出差的人中一个自己喜欢的都没有。他一共有( )种出差人选的方案。 {{ select(14) }}
113
105
112
104
一个递增的int类型数组有200个元素,如果用二分法查找数组中的整数num,则最多需要比较( )次就可以断定该num是否在数组n中。 {{ select(15) }}
5
6
7
8
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 ✓ ✓,错误填 × ×;除特殊说明外,判断题每题2分,选择题每题3分,共计40分) (1) cpplline-numbers #include using namespace std;
bool isPrime(int n) { for (int i=2; i<n; ++i) if (n % i == 0) return false; return true; } int Euler(int n) { int ret = n; for (int i=2; i<=n; ++i) if (n % i == 0 && isPrime(i)) ret = ret / i * (i-1); return ret; }
int main() { int x; cin >> x; // 保证 x 是正整数且不大于 10000000 cout << Euler(x) << endl; return 0; } 判断题 当输入为12时,程序的输出为4。 {{ select(16) }}
正确
错误
将isPrime()函数中的for循环改成 for(int i=2; i*i<n; ++i),程序结果不变。 {{ select(17) }}
正确
错误
将 ret = ret / i * (i-1); 改成 ret = ret * (i-1) / i;,结果可能与原程序结果不一样。 {{ select(18) }}
正确
错误
选择题 将Euler()函数中的for循环改成 for(int i=2; i*2<n; ++i),下列哪一个输入的结果会与原程序结果不同?( ) {{ select(19) }}
25
26
27
28
当输入为2025时,程序的输出为( )。 {{ select(20) }}
135
270
540
1080
(2) cpplline-numbers #include #include using namespace std; int Deal(int n, int s, vector& arr) { int count = 0; vector sum; sum.push_back(0); for (int i = 1; i <= n; ++i) { sum.push_back(sum[i-1] + arr[i]); } for (int i = 1; i <= n; ++i) { int L = i, R = n; while (L <= R) { int mid = (L + R) >> 1; if (sum[mid] - sum[i-1] <= s) { L = mid + 1; } else { R = mid - 1; } } count += (R - i + 1); } return count; } int main() { // 输入均为正整数 int n, s; cin >> n >> s; vector arr(n+1); arr[0] = 0; for (int i = 1; i <= n; ++i) cin >> arr[i]; cout << Deal(n, s, arr) << endl; return 0; } 判断题 输入如下时,输出为8。
text 4 5 1 2 3 4 {{ select(21) }}
正确
错误
sum[mid] - sum[i-1] 的意思为 arr[i-1] + arr[i] + ... + arr[mid]。 {{ select(22) }}
正确
错误
若输入完对arr数组排序,结果与原程序结果一样。 {{ select(23) }}
正确
错误
选择题 (2分)若将主函数里的 arr[0] = 0 改为 arr[0] = 1,结果与改之前相比( )。 {{ select(24) }}
只可能变大
只可能变小
不变
可能变大也可能变小
若将Deal()函数中开始的sum.push_back(0);改为sum.push_back(1);,结果与改之前相比( )。 {{ select(25) }}
一定不会变大
一定不会变小
一定不变
可能变大也可能变小
若输入的 s s 满足 s ⩾ a r r [ 1 ] + a r r [ 2 ] + ⋯ + a r r [ n ] s⩾arr[1]+arr[2]+⋯+arr[n],则输出必为( )。 {{ select(26) }}
n ( n + 1 ) / 2 n(n+1)/2
n ( n − 1 ) / 2 n(n−1)/2
n ( n + 1 ) n(n+1)
n ( n − 1 ) n(n−1)
(3) cpplline-numbers #include using namespace std; int Function(int a, int b) { if (b == 0) return 1; if (a - 1 >= b) return Function(a-1, b) + Function(a-1, b-1); return Function(a-1, b-1); } int main() { // 输入均为正整数 int a, b; cin >> a >> b; cout << Function(a, b) << endl; return 0; } 判断题 输入5 2时,程序的输出为10。 {{ select(27) }}
正确
错误
输入的a小于b时,Function函数可能陷入无限递归。 {{ select(28) }}
正确
错误
程序的运行时间与b相关但与a无关,且b越大运行时间越长。 {{ select(29) }}
正确
错误
选择题 (2分)输入10 7时,程序的输出为( )。 {{ select(30) }}
70
120
360
720
若输入的a不变,b依次取1,2,...,a,则程序的输出( )。 {{ select(31) }}
单调变大
单调变小
先变小再变大
先变大再变小
若将 if (b == 0) 改成 if (b == 1),并输入12 5,则程序的输出为( )。 {{ select(32) }}
165
330
495
792
三、完善程序(单选题,每小题3分,共计30分) (1) 找子串个数 cpplline-numbers #include #include using namespace std; int main() { int count = ①; string a,b; cin >> a >> b; for (int i = 0; i < a.length(); ++i) { int flag = ②; for (int j = 0; j < ③; ++j) { if (④) { flag = 1; break; } } if (flag == 0) ⑤; } cout << count << endl; return 0; } ①处应填( ) {{ select(33) }}
0
1
2
3
②处应填( ) {{ select(34) }}
0
1
2
3
③处应填( ) {{ select(35) }}
a.length()
b.length()
a.length()-1
b.length()-1
④处应填( ) {{ select(36) }}
a[j] != b[j]
a[i+j] != b[i+j]
a[j] != b[i+j]
a[i+j] != b[j]
⑤处应填( ) {{ select(37) }}
break
continue
count = 1
++count
(2) 以最小代价删除字符 cpplline-numbers #include #include #include #include using namespace std; int main() { string s1, s2; cin >> s1 >> s2; int n = s1.length(); vector<vector> dp(n+1, vector(n+1)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { dp[i][j] = ①; if (②) { dp[i][j] = max(dp[i][j], ③); } } } int count = 0; for (int i = 0; i < n; ++i) count += ④; cout << ⑤ << endl; return 0; } ①处应填( ) {{ select(38) }}
max(dp[i][j], dp[i-1][j-1])
max(dp[i-1][j], dp[i][j-1])
min(dp[i][j], dp[i-1][j-1])
min(dp[i-1][j], dp[i][j-1])
②处应填( ) {{ select(39) }}
s1[i] == s2[j]
s1[i-1] == s2[j-1]
s1[i] == s2[j-1]
s1[i-1] == s2[j]
③处应填( ) {{ select(40) }}
dp[i-1][j-1] + s1[i-1] - 'a'
dp[i-1][j] + s1[i-1] - 'a'
dp[i][j-1] + s2[i] - 'a'
dp[i-1][j-1] + 2*(s1[i-1] - 'a')
④处应填( ) {{ select(41) }}
s1[i] - 'a'
s2[i] - 'a'
s1[i] + s2[i] - 'a'
s1[i] + s2[i] - 2*'a'
⑤处应填( ) {{ select(42) }}
dp[n][n]
count + dp[n][n]
count - dp[n][n]
count - 2 * dp[n][n]