#183. CSP-J 2026 初赛模拟卷 10

0

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