信息技术来源:浙江强基联盟2026年3月高三联考
第 12 题
答案与解析
本题解析
参考答案
C
解题思路
程序反复取查找区间的对分点m,并根据a[m]与x的比较结果移动左右边界,采用了对分查找。
程序分析
g = [0, 4, 7, 10]
x = random.randint(22, 24)
count = 0
for i in range(len(g) - 1):
L, R = g[i], g[i+1] - 1
ans = g[i] - 1
...randint(22, 24)包含两端,因此x只可能为22、23、24。由L、R的赋值可知,g把a分为下标0~3、4~6、7~9三段,分别是[15, 23, 23, 30]、[10, 25, 35]、[12, 18, 22]。每段均按非降序排列,可以分别进行对分查找。每段开始时,ans先置为该段起点的前一位。
while L <= R:
m = (L + R) // 2
if a[m] < x:
ans = m
L = m + 1
else:
R = m - 1若 a[m] < x,就把 m 记入 ans,并继续向右查找,以寻找下标更大的满足条件的元素;否则 a[m] 及其右侧元素都不小于 x,只需继续向左查找。区间为空时,ans 即该段最后一个小于 x 的元素下标;若一个也没有,ans 保持为该段起点的前一位。
count += (ans - g[i] + 1)每段有序,小于 x 的元素从该段起点连续排列到 ans,因此数量为 ans - g[i] + 1;没有符合条件的元素时该式为 0。将三段的数量累加,count 就是整个列表中严格小于 x 的元素个数。
按已经确定的统计功能,只需覆盖 x 的全部三个取值:
| x | 第一段小于 x 的个数 | 第二段小于 x 的个数 | 第三段小于 x 的个数 | count |
|---|---|---|---|---|
| 22 | 1 | 1 | 2 | 4 |
| 23 | 1 | 1 | 3 | 5 |
| 24 | 3 | 1 | 3 | 7 |
当 x 从 23 变为 24 时,第一段中的两个 23 同时计入,count 从 5 直接增加到 7。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_qiangjilianmeng_q012
