提高组 CSP-S 2026 初赛模拟卷8
提高组 CSP-S 2026 初赛模拟卷8
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
提高组 CSP-S 2026 初赛模拟卷8
- 十进制的160.5相当于十六进制的( )。 {{ select(1) }}
- A0.8
- F.5
- 80.25
- 无限小数
- 在具有2n个节点的完全二叉树中,叶节点的个数为( )。 {{ select(2) }}
- n-1
- n
- n+1
- 不能确定
- 6个棋子围成一圈,每个棋子可染黑色或白色,通过旋转可重合的算一种方案,则一共有( )种着色方案。 {{ select(3) }}
- 32
- 20
- 16
- 14
- 假设x和y是两个独立的随机实数变量,且它们都是从[0,1]的均匀分布里随机生成的,则min(x,y)的期望值是( )。 {{ select(4) }}
- 1/4
- 1/3
- 1/2
- 不是有理数
- 设某算法的计算时间表示为递推关系式T(n)=T(n-1)+3n(n为正整数),且T(0)=1,则该算法的时间复杂度为( )。 {{ select(5) }}
- O(n)
- O(n²)
- O(n log n)
- O(n³)
- 在单链表指针p指向的节点后,插入指针s指向的节点,正确的操作是( )。 {{ select(6) }}
- p->next = s; s->next = p->next;
- s->next = p->next; p->next = s;
- p->next = s; p->next = s->next;
- p->next = s->next; p->next = s;
- 前缀表达式
+ 3 * 2 + 5 1 2的值是( )。 {{ select(7) }}
- 23
- 37
- 33
- 35
- 若在某进制下7×7=41成立,那么在该进制下12×12=( )。 {{ select(8) }}
- 144
- 100
- E4
- 81
- 寄存器是( )的重要组成部分。 {{ select(9) }}
- 硬盘
- 高速缓存
- 内存
- 中央处理器(CPU)
- 无向图G=(V,E),其中V={A₀, A₁, A₂, A₃},E={(A₀,A₁), (A₀,A₂), (A₀,A₃), (A₁,A₃)}。以A₀为起点进行深度优先搜索,遍历顺序不可能是( )。 {{ select(10) }}
- A₀, A₁, A₂, A₃
- A₀, A₁, A₃, A₂
- A₀, A₂, A₁, A₃
- A₀, A₃, A₁, A₂
- 双向链表的节点包含两个指针域,llink和rlink,分别指向其前驱节点和后继节点。设p指向链表中的一个节点,q指向一待插入节点。现要求在p前插入q,则正确的插入操作为( )。 {{ select(11) }}
- p->llink = q; q->rlink = p; p->llink->rlink = q; q->llink = p->llink;
- q->llink = p->llink; q->rlink = p; p->llink = q; p->llink->rlink = q;
- q->rlink = p; p->rlink = q; p->llink->rlink = q; q->rlink = p;
- p->llink->rlink = q; q->rlink = p; q->llink = p->llink; p->llink = q;
- 有向图G=(V,E),其中V={A₀, A₁, A₂, A₃, A₄},从顶点A₀出发进行广度优先搜索(BFS),一种可行顺序是A₀, A₄, A₂, A₃, A₁。以(x,y)表示x指向y的有向边,则边集E可能是( )。 {{ select(12) }}
- {(A₀,A₁),(A₀,A₂),(A₀,A₃),(A₀,A₄),(A₂,A₁),(A₂,A₃)}
- {(A₀,A₁),(A₀,A₃),(A₁,A₂),(A₂,A₃),(A₃,A₄)}
- {(A₀,A₁),(A₀,A₂),(A₀,A₄),(A₂,A₁),(A₂,A₃),(A₃,A₄)}
- {(A₀,A₁),(A₀,A₂),(A₀,A₃),(A₂,A₁),(A₂,A₃),(A₃,A₄)}
- 一棵二叉树的前序遍历序列是ABCDEFG,后序遍历序列是CBFEGDA,则根节点的左子树的节点个数可能是( )。 {{ select(13) }}
- 0
- 2
- 4
- 6
- 由3个a、5个b和2个c构成的所有字符串中,包含子串abc的共有( )个。 {{ select(14) }}
- 840
- 820
- 800
- 780
- 拓扑排序是指将有向无环图G中的所有顶点排成一个线性序列……对有向无环图G=(V,E),V={1,2,3,4,5,6,7,8,9},E={(1,2),(1,5),(2,3),(3,4),(3,7),(4,6),(7,6),(8,9)},可能的拓扑序列的个数为( )。 {{ select(15) }}
- 336
- 432
- 96
- 343
(1)
#include <iostream>
using namespace std;
int n;
int main(){
cin >> n; // 保证输入为正整数
int ans = n;
for(int i = 2; i <= n; i++){
if(n % i == 0){
while(n % i == 0) n /= i;
ans = ans / i * (i - 1);
}
}
cout << ans << endl;
return 0;
}
- 该算法的时间复杂度为 O(n)。( ) {{ select(16) }}
- True
- False
- 输出的数一定不会比n大。( ) {{ select(17) }}
- True
- False
- 如果n>2,则输出一定是偶数。( ) {{ select(18) }}
- True
- False
- 如果n是素数,则输出就是n。( ) {{ select(19) }}
- True
- False
- 输入1001时,输出为( )。 {{ select(20) }}
- 1024
- 1000
- 720
- 512
- 依次输入1~20,则输出的最大值为( )。 {{ select(21) }}
- 10
- 12
- 15
- 18
(2)
#include <iostream>
#include <string>
using namespace std;
int n, x[100];
string s[100];
int main(){
while(cin >> s[++n]);
n--;
for(int i = 1; i <= n; i++)
for(int j = 0; j < s[i].size(); j++)
x[i] = x[i] * x[i] + s[i][j];
int ans = n;
for(int i = n; i >= 1; i--){
bool b = 0;
for(int j = 1; j < i && !b; j++)
if(x[i] == x[j]) b = true;
ans -= b;
}
cout << ans << endl;
return 0;
}
- 输入的时候如果有多行,则只会读入第一行。( ) {{ select(22) }}
- True
- False
- 第二组for循环(
int ans = n;之后开始的)的时间复杂度可以优化到O(nlogn)。( ) {{ select(23) }}
- True
- False
- 如果只输入小写字母,且所有
s[i].size()<=10,则x[i]最终的值都是正数。( ) {{ select(24) }}
- True
- False
- 输入
in dzds left brain there is nothing left while in his right there is nothing right,并将第12行改为x[i]=x[i]*x[i]*x[i]+s[i][j];,输出不会有变化。( ) {{ select(25) }}
- True
- False
- 输入
in theory theory and practice are the same in practice they are not,输出为( )。 {{ select(26) }}
- 13
- 11
- 9
- 7
- 以下描述中错误的是( )。 {{ select(27) }}
- 输出的时候,ans的值一定不大于n的值
- 无须定义字符串数组也能实现同样的功能
- 输入长度为10的10个由小写字母组成的单词,则输出概率最大的值是10
- 设只输入小写字母且
s[i].size()≤10,如果s[j]≠s[k],则一定有x[j]≠x[k](1≤j<k≤n)
(3)
#include <bits/stdc++.h>
using namespace std;
int a[1010][12], n, m, pw[12] = {1};
int main(){
cin >> n >> m; // 保证 0< n,m≤1000
for(int h = 1, p = 2; p <= n; p *= 2, h++) pw[h] = 2 * pw[h-1];
for(int i = 1; i <= n; i++) cin >> a[i][0];
for(int h = 1; pw[h] <= n; h++)
for(int i = 1; i <= n - pw[h] + 1; i++)
a[i][h] = max(a[i][h-1], a[i + pw[h-1]][h-1]);
for(int i = 1, x, y, h; i <= m; i++){
cin >> x >> y; // 保证 1≤x≤y≤n
for(h = 0; pw[h] * 2 <= y - x + 1; ) h++;
cout << max(a[x][h], a[y - pw[h] + 1][h]) << " ";
}
return 0;
}
- 输入 n=100 时,数组 pw 中非零元素共有7个。( ) {{ select(28) }}
- True
- False
- 对一组 x=y 的输入,对应的输出就是x。( ) {{ select(29) }}
- True
- False
- 固定 i,则 a[i][h] 的值随 h 单调不降,不考虑没被赋值过的位置。( ) {{ select(30) }}
- True
- False
- 将倒数第5行中for循环的循环条件改为
pw[h+1]<=y-x+1,结果不会有变化。( ) {{ select(31) }}
- True
- False
- 此程序的时间复杂度为( )。 {{ select(32) }}
- O(n(n+m))
- O((n+m)logn)
- O(n²+m)
- O(n logn + m)
- 输入如下,输出为( )。
5 3
1 5 2 4 3
1 5
2 4
3 3
{{ select(33) }}
- 555
- 543
- 552
- 542
(1)
二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值,小于其右子树上所有节点的值。试判断一棵树是否为二叉查找树。
输入格式:第一行一个整数n,表示节点数,编号1..n,1为根。接下来第i行有三个数value, left_child, right_child,分别表示节点i的值、左子节点编号、右子节点编号(0表示不存在)。
输出要求:输出1表示是二叉查找树,0表示不是。
#include <iostream>
using namespace std;
const int INF = 1000000;
struct node{ int l, r, v; } a[100];
int n;
int check(int x, int lower_bound, int upper_bound){
if(x == 0) return 1;
return ① && ② && check(③) && check(④);
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i].v >> a[i].l >> a[i].r;
cout << check(⑤, -INF, INF) << endl;
return 0;
}
- ①处应填( )。 {{ select(34) }}
- x > lower_bound
- x < lower_bound
- a[x].v > lower_bound
- a[x].v < lower_bound
- ②处应填( )。 {{ select(35) }}
- x > upper_bound
- x.v < upper_bound
- a[x].v > upper_bound
- a[x].v < upper_bound
- ③处应填( )。 {{ select(36) }}
- a[x].r, a[x].v, lower_bound
- a[x].r, lower_bound, a[x].v
- a[x].l, a[x].v, lower_bound
- a[x].l, lower_bound, a[x].v
- ④处应填( )。 {{ select(37) }}
- a[x].r, a[x].v, upper_bound
- a[x].r, upper_bound, a[x].v
- a[x].l, a[x].v, upper_bound
- a[x].l, upper_bound, a[x].v
- ⑤处应填( )。 {{ select(38) }}
- 0
- 1
- -1
- INF
(2)
有一个 n×n(1≤n≤5000)的矩阵 a,对任意相邻元素,右边比左边大,下面比上面大(即行、列均严格递增)。给定一个数 k,找出 k 所在的行和列。输入保证矩阵中的数各不相同,且 k 存在。
#include <iostream>
using namespace std;
int n, k, answerx, answery;
int a[5001][5001];
void FindKPosition(){
int ①;
while(j > 0){
if(a[n][j] < k) break;
j--;
}
②;
while(a[i][j] != k){
while(③ && i > 1) i--;
while(④ && j <= n) j++;
}
⑤;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) cin >> a[i][j];
cin >> k;
FindKPosition();
cout << answerx << " " << answery << endl;
return 0;
}
- ①处应填( )。 {{ select(39) }}
- i=1, j=1
- i=1, j=n
- i=n, j=1
- i=n, j=n
- ②处应填( )。 {{ select(40) }}
- i++
- i--
- j++
- j--
- ③处应填( )。 {{ select(41) }}
- a[i-1][j] > k
- a[i][j] > k
- a[i-1][j] < k
- a[i][j] < k
- ④处应填( )。 {{ select(42) }}
- a[i][j+1] > k
- a[i][j] > k
- a[i][j+1] < k
- a[i][j] < k
- ⑤处应填( )。 {{ select(43) }}
- answerx = i, answery = j
- answerx = i, answery = j+1
- answerx = i-1, answery = j
- answerx = i-1, answery = j+1