初赛模拟错题,难题合集
CSP-S 初赛模拟试题1
选择题
-
微型计算机中,( )的存取速度最快
A.高速缓存 B.寄存器 C.外存储器 D.内存储器
Sol:寄存器>高速缓存>内存储器>外存储器 -
由数字1,2,3,4,5,6,7(同一数字可以重复使用)所组成的不同的三位数中有( )个是3的倍数
A.43 B. 72 C. 78 D.115
Sol:把所有数分为三类,mod 3 为 0/1/2 就变为了 (3,6) (1,4,7) (2,5)。
答案就是 0+0+0 0+1+2 0+2+1 1+0+2 1+1+1 1+2+0 2+0+1 2+1+0 2+2+2
8 + 12 + 12 + 12 + 27 + 12 + 12 + 12 +8=12*6+16+27=115
程序阅读
二、阅读程序写结果
1.
题号 (1) (2) (3) (4) (5) (6)
答案 × × × √ B C
【解析】
程序统计了 a[i] xor a[j]中出现次数最多的数(如有多个则取最小的)。
(1) 𝑛可以等于5000。
(2) 输出的可能为0。
(3) a[i]很大时,它们的异或值不一定大。
(4) 因为答案初始化为0,可以不从0开始枚举。
(5) 只要𝑛 > 1,所有 a[i]=i 时,答案一定为1。
(6) 0~15中的所有结果都有可能。
题号 (1) (2) (3) (4) (5) (6)
答案 √ × √ √ C C
【解析】
(1) 每次只会在满足条件的情况下调用该函数。
(2) 准确地说,应该满足
𝑖
=
m
a
x
(
𝑡
1
+
𝑡
2
−
𝑛
,
0
)
𝑖 = max(𝑡1 + 𝑡2 − 𝑛, 0)
i=max(t1+t2−n,0)。
(3)
𝑡
1
,
𝑡
2
𝑡1,𝑡2
t1,t2的顺序对答案并没有影响。
(4) 由于𝑠1在统计出𝑡1之后并不会再使用,可以重复利用这个数组。
(5) 当
𝑠
1
𝑠1
s1和
𝑠
2
𝑠2
s2分别为
0101010
0101010
0101010 和
1101101
1101101
1101101 时,答案为63。
(6) 对于1~𝑁中的每一个数,都需要做一次快速幂,复杂度为
O
(
𝑁
l
o
g
𝑁
)
O(𝑁 log 𝑁)
O(NlogN)
题号 (1) (2) (3) (4) (5) (6)
答案 × × × × C A
【解析】
(1) 如果不使用数组进行记忆化组合数的值,算法每次求组合数将花费 𝑂(𝑛𝑚) 的时
间,所以是错误的。
(2) 预处理 𝑝𝑤 数组时,𝑖 枚举到了 1005,超出了数组定义的范围。但由于越界后值
会修改到𝑞,如果恰好修改的是𝑞的值并不会发生错误。
(3) 显然会改变,将 𝑗 = 𝑛 代入验证即可。
(4) 显然会改变,将 𝑗 = 𝑛 代入验证即可。
(5) 直接暴力枚举即可。
(6) 考虑范围比较大,可以直接画表格递推。
完善程序
无
CSP-S 初赛模拟试题2
选择题
-
排序大纲
-
若𝑛, 𝑚 都是0~255中的整数,则有( )对𝑛, 𝑚满足n + m = (𝑛 and 𝑚) xor (𝑛 or 𝑚)。
A.256 B.6561 C.6739 D.65536
Sol: x+y=x xor y(当x,y,每一位都不一样) 分别考虑每一位,只要满足不都是 1 即可,因此每一位有三种情况 (0,1)(1,0)(0,0)答案为 3 8 3^8 38 = 6561 -
.在1~10的所有排列中,有( )个满足3排在第二位,且与1相邻的数都是偶数
A. 86400 B.100800 C. 111600 D. 120960
Sol: 分 1 在第 3~9 位和第 10 位两种情况讨论,选出两个偶数放在 1 旁边,剩下的数可以按任意顺序排列
程序阅读
(1) 总共有|𝑠| + 1个数,其中最小的数为0,最大的数小于等于|𝑠|,总和一定严格小于
(|𝑠| + 1)
2。
(2) T 表示队列中的元素个数,最终肯定恰好为𝑛。
(3) 不会改变,因为 k=1 时 s[k-1]= ‘%’,一定不等于’L’。
(4) 转移都是单向的,不可能出现 i 转移到 i±1 再转移回来的情况,因此复杂度不受
影响。
(5) 直接模拟即可。
(6) 考虑每个“LLRL”,发现𝑥个“LLRL”对应的答案为6𝑥 − 2。
题号 (1) (2) (3) (4) (5)
答案 C D C B C
【解析】
考虑排序后,可以证明每个人匹配的马一定在一个范围内,修改可以用线段树维护
矩阵优化 DP 实现,但是这个转移矩阵是取 max 广义乘法矩阵。设 f[i]表示前 i 个马和人
的匹配最大权值和,显然 f[i]只能从 f[i-1],f[i-2],f[i-3]转移而来。
(1) 初值显然为 -inf。
(2) 取 max 广义乘法。
(3) 注意转移时不能出现人和马匹配的情况
(4) 乘的时候一定要是右子树乘左子树,因为这个矩阵乘法不满足交换律。
(5) 更新 ban 数组,注意一开始映射是用 pa 的。
【解析】
程序实现了权值线段树合并维护某个子树的子树大小,子树内每个节点的深度值和,
子树内每个节点的深度值平方和(此处的深度值指某个点到根的路径上的边权和)
(1) 线段树合并 y 合并到 x 上,如果 x 不存在,直接令 x=y
(2) 由于深度值已经经过零散化用 vector g 来存储,vector 下标从 0 开始编
号,因此为 g[v − 1]
(3) X 表示当前节点的实际深度值,dis[x] 已经过离散化,故为 g[dis[x] − 1]
(4) 式子题,设当前节点深度值为 X 与另一个深度值为 y 的节点匹配,LCA 深度值
为 dis,令
Z
=
d
i
s
∗
2
+
1
Z = dis ∗ 2 + 1
Z=dis∗2+1 ,此时 X >= y,故三角形另一条边 z 的范围
X
−
y
<
z
<
X
+
y
−
2
∗
d
i
s
X − y < z < X + y −2 ∗ dis
X−y<z<X+y−2∗dis
所以树三角个数会增加
X
+
y
−
2
×
d
i
s
−
1
−
(
X
−
y
+
1
)
+
1
=
2
×
y
−
1
−
2
×
d
i
s
=
2
×
y
−
Z
X + y − 2 × dis − 1 − (X − y + 1) + 1 = 2 × y − 1 − 2 ×dis = 2 × y − Z
X+y−2×dis−1−(X−y+1)+1=2×y−1−2×dis=2×y−Z
所以树三角大小会增加
(
X
+
y
−
2
×
d
i
s
)
×
(
2
×
y
−
Z
)
+
(
X
+
y
−
2
×
d
i
s
−
1
+
X
−
y
+
1
)
×
(
2
×
y
−
Z
)
/
2
=
(
X
+
y
−
Z
+
1
)
×
(
2
×
y
−
Z
)
+
(
2
×
X
−
Z
+
1
)
×
(
2
×
y
−
Z
)
/
2
(X + y − 2 × dis) × (2 × y − Z) + (X + y − 2 ×dis − 1 + X − y + 1) × (2 × y − Z)/2 = (X + y − Z + 1) × (2 × y − Z) + (2 × X − Z + 1) ×(2 × y − Z)/2
(X+y−2×dis)×(2×y−Z)+(X+y−2×dis−1+X−y+1)×(2×y−Z)/2=(X+y−Z+1)×(2×y−Z)+(2×X−Z+1)×(2×y−Z)/2,与 A 项相同
(5) 式子题,设当前节点深度值为 X 与另一个深度值为 y 的节点匹配,LCA 深度值为
d
i
s
dis
dis,令
Z
=
d
i
s
∗
2
+
1
Z = dis ∗ 2 + 1
Z=dis∗2+1,此时
X
<
y
X < y
X<y,故三角形另一条边 z 的范围
y
−
X
<
z
<
y
+
X
−
2
∗
d
i
s
y − X < z < y + X −2 ∗ dis
y−X<z<y+X−2∗dis,所以树三角个数会增加
y
+
X
−
2
×
d
i
s
−
1
−
(
y
−
X
+
1
)
+
1
=
2
×
X
−
1
−
2
×
d
i
s
=
2
×
X
−
Z
y + X − 2 × dis − 1 − (y − X + 1) + 1 = 2 × X − 1 − 2 ×dis = 2 × X − Z
y+X−2×dis−1−(y−X+1)+1=2×X−1−2×dis=2×X−Z,由于求的是 X 与已加入线段树的所有满足条件的 y 匹配的答案之和,所
以个数增加了
(
2
×
X
−
Z
)
×
t
m
p
2
(2 × X − Z) × tmp2
(2×X−Z)×tmp2 ( tmp2 是满足条件的节点个数)
CSP-S 初赛模拟试题6
选择题
-
同时查找 2n 个数中的最大值和最小值,最少比较次数为()
A. 3(n-2)/2 B. 4n-2 C. 3n-2 D. 2n-2
Sol:前两个数比较,大的为最大值,小的为最小值,用掉一次比较。后面 2(n-1)个数,每两个比较,大的同最大值比较,小的同最小值比较,3(n-1)次比较,共 3(n - 1) + 1= 3n - 2 次比较** -
数列{an}是等差数列,首项 a1>0,a2020+a2021>0,a2020×a2021<0,则使前 n 项和Sn>0 成立的最大项数 n 是()
A. 2020 B. 4040 C. 4041 D. 4042
假设:a2020+a2021=0 则: |a1+a2+…a2020| =|a2021+…a4040|,就是关于数轴的原点对称,那么最好的情况就是将原点向右移动一下
程序阅读
- (4) 当 n<=1e8 时,_sqrt 的值一定会小于 sqrt(1e9),所以 j<cnt 去掉后那个 for
循环至少会因为访问到 p[j]>_sqrt 的 j 的位置而导致循环结束,并不影响程序正确性,也
不会出现运行错误。正确
完善程序
题目中的程序就是遍历 FBZ 树的前序遍历。与往常程序不同,本题用 while 循环代替
递归。
(1) s2 指当前处理的字符串,s1 指所有出现的字符串个数。
(2) 全为 1 就是 B。
(3) 全为 0 就是 Z。
(4) 将当前的所有字符串向后移动两位,给即将出现的两个字符串空出位置。
(5) 将原串分成两半。
(6) (7) 将缩短后的串后半部分清空。
CSP-S 初赛模拟试题7
选择题
程序阅读
无
完善程序
无
CSP-S 初赛模拟试题8
选择题
无
程序阅读
无
完善程序
-
【解析】
(1) 观察函数名:isleaf,可猜测该函数功能为判断一个点是否为叶子,显然左右儿子
都不存在时该点为叶子,故选 B。
(2) 因为该树为二叉树,故当前点的儿子情况仅有 4 种: 左右儿子均不存在(叶子)
或 左儿子不存在 或 右儿子不存在 或两儿子均存在,而观察程序第 10,13,14 行可知前三
种情况已经判断掉了,故猜测 15 行处是处理两儿子均存在的情况,故选 A。
(3) t1,t2,t3,t4 均为 t 的搜索树上的儿子,显然必须这四个都合法,t 才合法,故选 A。
(4) t 记录的是每一个树的根,所以要新建根 tot + 1。
(5) tot 记录的是总共的点数,每次共 n 个点加进来,故为 tot += n。