#183. CSP-J 2026 初赛模拟卷 10
CSP-J 2026 初赛模拟卷 10
CSP-J 2026 初赛模拟卷 10 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 16人参加1v1单打比赛,决出冠军。比赛采用双败淘汰制:第1轮随机配对,胜者进入胜者组,败者进入败者组。以后每轮在两组内分别配对进行(除非该组只剩1人),如在胜者组战败,则降入败者组;在败者组战败则淘汰,在败者组获胜留在败者组(不会升入胜者组)。如此反复进行直到两组都只剩1人,再进行最后一场决赛决出冠军。那么总共要进行( )场比赛。 {{ select(1) }}
15
30
31
120
5个人穿5种颜色的衣服坐在5种颜色的椅子上,每人一把椅子。要求每个人的衣服颜色和椅子颜色都不相同。两种坐法不同当且仅当至少有1个人坐的椅子不同,则总共有( )种可能的坐法。 {{ select(2) }}
5
32
44
120
正整数 x x 和 y y 的最大公约数 gcd ( x , y ) gcd(x,y) 定义为能同时整除 x x 和 y y 的最大正整数。例如, gcd ( 12 , 18 )
6 gcd(12,18)=6。那么 gcd ( 12345 , 54321 )
gcd(12345,54321)=( )。 {{ select(3) }}
3
5
7
15
1至100的整数的乘积末尾有( )个连续的0。 {{ select(4) }}
100
50
24
12
在三维直角坐标系里任取 n n 个整点(坐标都是整数的点),要保证其中一定存在两个点连线的中点也是整点, n n 至少是( )。 {{ select(5) }}
2
3
7
9
同时掷出3枚完全相同的六面骰子,每枚骰子上有1到6的数字。将得到的点数排序后,有( )种不同的结果。 {{ select(6) }}
208
56
216
120
5个有标号的点在没有重边或者自环的情况下,可组成的不同无向图个数为( )。 {{ select(7) }}
10
1024
15
120
若某算法的计算时间表示为递推关系式 T ( n )
9 T ( n / 3 ) + n T(n)=9T(n/3)+n,且 T ( 1 )
1 T(1)=1,则该算法的时间复杂度是( )。 {{ select(8) }}
O ( n ) O(n)
O ( 2 n ) O(2 n )
O ( n 2 ) O(n 2 )
O ( n log n ) O(nlogn)
8位二进制补码中,10101011表示的数是十进制下的( )。 {{ select(9) }}
43
-43
-85
-84
下列算法中,完全不涉及贪心思想的算法为( )。 {{ select(10) }}
Kruskal算法(最小生成树)
Floyd算法(多源最短路)
Dijkstra算法(单源最短路)
Kahn算法(拓扑排序)
已知 a
3 a=3, b
5 b=5,执行 a ^= b ^= a ^= b 后, a a 的值为( )。 {{ select(11) }}
3
5
6
0
已知一个栈的入栈顺序为1,2,...,n( n ⩾ 3 n⩾3),第1个出栈的是3,那么第2个出栈的数有( )种可能。 {{ select(12) }}
n − 1 n−1
n − 2 n−2
n − 3 n−3
n − 4 n−4
一个 n n 节点无向图没有重边和自环,它是一棵无根树的必要条件不包括( )。 {{ select(13) }}
连通
有 n − 1 n−1 条边
没有环
每个点的度数都大于0
Dijkstra算法中没有涉及( )算法思想。 {{ select(14) }}
贪心法
动态规划
二分法
调整法
将正整数 n n 拆成任意多个正整数之和,使这些加数的乘积最大,则加数中不可能出现( )。 {{ select(15) }}
1
2
4
5
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 ✓ ✓,错误填 × ×;除特殊说明外,判断题每题2分,选择题每题3分,共计40分) (1) cpplline-numbers #include using namespace std; const int N = 1009; int n, q[N], x[N]; int main() { cin >> n; // 保证输入的数都是正整数,1 <= x[i] <= n <= 1000 for (int i = 1; i <= n; i++) cin >> x[i]; for (int i = 1; i <= n; i++) { for (int j = i; j >= x[i] + 1; j--) q[j] = q[j - 1]; q[x[i]] = i; } for (int i = 1; i <= n; i++) cout << q[i] << " "; return 0; } 判断题 (1分)如果输出的每个数都不是0,那么输入的x[i]必须互不相同。 {{ select(16) }}
正确
错误
(1分)输出的n个数一定是1..n的一个排列(取值在1..n范围内且没有重复)。 {{ select(17) }}
正确
错误
输出的 n n 个数中除了0以外,其他数都互不相同。 {{ select(18) }}
正确
错误
如果输入的 x [ i ] x[i] 单调不降,则输出也单调不降。 {{ select(19) }}
正确
错误
选择题 固定 n n,对各种符合输入限制的 x [ i ] x[i] 情况,最好和最坏情况下代码的时间复杂度分别为( )。 {{ select(20) }}
O ( n ) O(n), O ( n 2 ) O(n 2 )
O ( n 2 ) O(n 2 ), O ( n 2 ) O(n 2 )
O ( n ) O(n), O ( n ) O(n)
O ( n log n ) O(nlogn), O ( n 2 ) O(n 2 )
若输入8 1 1 2 3 1 1 2 3,则输出为( )。 {{ select(21) }}
1 1 2 3 1 1 2 3
6 7 8 5 2 3 4 1
1 6 7 8 5 2 3 4
5 3 4 1 8 6 7 2
(2) cpplline-numbers #include <bits/stdc++.h> using namespace std; const int N = 10009; int n, cur, nxt[N];
int main() { cin >> n; // 保证 n 是 1~10000 范围内的整数 for (int i=1; i<=n; ++i) nxt[i] = i % n + 1; for (cur=1; n>1; --n) { nxt[cur] = nxt[nxt[cur]]; cur = nxt[cur]; } cout << cur << endl; return 0; } 判断题 程序运行结束后,除了最后的cur,其他nxt的值都为0。 {{ select(22) }}
正确
错误
若将for循环内的两句合并为 cur = nxt[cur] = nxt[nxt[cur]];,则运行结果不会改变。 {{ select(23) }}
正确
错误
若将for循环中的条件 n>1 改为 n>0,则运行结果不会改变。 {{ select(24) }}
正确
错误
假如强行输入 n=-1,程序会异常退出。 {{ select(25) }}
正确
错误
选择题 如上代码的时间复杂度是( )。 {{ select(26) }}
O ( n ) O(n)
O ( n log n ) O(nlogn)
O ( n n ) O(n n )
O ( n 2 ) O(n 2 )
若输入10000,则输出为( )。 {{ select(27) }}
3616
3617
3618
3619
(3) cpplline-numbers #include <bits/stdc++.h> using namespace std; typedef long long ll; ll x[10009], s[509][10009], n, m; int main() { cin >> n >> m; // 保证 1 <= n <= 10000, 1 <= m <= 250000, 1 <= x[i] <= 1000000 for (ll i = 1; i <= n; i++) cin >> x[i]; ll D = max(1LL, (ll)sqrt(m)); for (ll d = 1; d <= D; d++) for (ll i = 1; i <= n; i++) if (i > d) s[d][i] = s[d][i - d] + x[i]; else s[d][i] = x[i]; for (ll i, d, k; m--) { cin >> i >> d >> k; // 保证输入的 1 <= i, d, k <= n k = min(k, (n - i) / d + 1); if (d <= D) { if (i > d) cout << s[d][i + (k - 1) * d] - s[d][i - d] << endl; else cout << s[d][i + (k - 1) * d] << endl; } else { ll sum = 0; for (int j = 0; j < k; ++j) sum += x[i + j * d]; cout << sum << endl; } } return 0; } 判断题 将所有整数类型long long都换成int,结果不变,因为输入数据都在int范围内。 {{ select(28) }}
正确
错误
假如k没有截断(去掉 k = min(k, (n - i) / d + 1); 这句),但问询的i,d,k保证了 i + ( k − 1 ) ∗ d ≤ n i+(k−1)∗d≤n,那么程序结果不会改变。 {{ select(29) }}
正确
错误
代码占用的内存空间大致为5MB。 {{ select(30) }}
正确
错误
在不影响时间复杂度的情况下,可以把空间复杂度优化到 O ( n + m ) O(n+m)。 {{ select(31) }}
正确
错误
选择题 此代码最坏情况下的时间复杂度是( )。 {{ select(32) }}
O ( n m ) O(nm)
O ( n 2 ) O(n 2 )
O ( n m ) O(n m )
O ( m n ) O(m n )
假如强行将以下某个变量的值输入为负数(其他变量仍为正数),一定会导致数组下标越界的是( )。 {{ select(33) }}
n
i
d
k
三、完善程序(单选题,每小题3分,共计30分) (1) 整数拆分 cpplline-numbers #include <bits/stdc++.h> using namespace std; int n, ans, sum; int main() { cin >> n; for (int i=1, j; i<=①; ++i) { for (j=i, ②; ③; j++) sum += j; if (④) ans++; } cout << ans << endl; // 该程序的时间复杂度是 ⑤ return 0; } ①处应填( ) {{ select(34) }}
n
n/2
(n+1)/2
n/2+1
②处应填( ) {{ select(35) }}
sum=0
sum=i
sum++
sum+=j
③处应填( ) {{ select(36) }}
j<=n
j<n
sum<=n
sum<n
④处应填( ) {{ select(37) }}
sum>=n
sum+j==n
sum==n
j-i>=2
⑤处应填( ) {{ select(38) }}
O ( n ) O(n)
O ( n log n ) O(nlogn)
O ( n n ) O(n n )
O ( n 2 ) O(n 2 )
(2) 绝对众数 cpplline-numbers #include using namespace std; int n, x, s, cnt; int main() { cin >> n; for (int i=1; i<=n; i++) { cin >> x; if (①) ②; if (③) ④; else ⑤; } cout << s << endl; return 0; } ①处应填( ) {{ select(39) }}
cnt > 0
cnt >= 0
cnt == 0
cnt < 0
②处应填( ) {{ select(40) }}
s = cnt
s = x
s = i
s = n
③处应填( ) {{ select(41) }}
x < s
x > s
x == s
x == cnt
④处应填( ) {{ select(42) }}
cnt++
cnt--
cnt = i
cnt = 0
⑤处应填( ) {{ select(43) }}
cnt++
cnt--
cnt = i
cnt = 0