信息技术来源:金华十校2026年4月高三模拟考试
第 12 题
答案与解析
本题解析
参考答案
B
程序分析
n = len(a)
j = 0
f = [0] * n
for i in range(1, n):
...
print(f[n - 1])外层循环从下标1开始,依次处理到下标n-1。j只在循环前初始化为0,各轮沿用此前的值;f的各项初值为0,最终输出f[n-1]。
while j < i and a[i] - a[j + 1] > k:
j += 1本题a递增,a[i]-a[j+1]就是连续区间a[j+1]至a[i]的最大值与最小值之差。差值大于k时,j右移,舍去区间左端较小的元素,直到差值不超过k。因右端a[i]逐轮增大,此前被舍去的左端元素不会重新满足条件,j无需退回。退出内层循环时,j+1是本轮这段连续区间能取到的最左下标。
f[i] = f[j] + 1将a[j+1]至a[i]作为一组,剩余部分就是a[1]至a[j]。f[i]取f[j]加1,表示在前一部分的分组结果后再增加这一组。因此,f[i]记录按上述规则对a[1]至a[i]分组所得的组数,每组最大值与最小值之差不超过k。f[0]=0对应尚未处理任何元素;a[0]本身不参与分组。
本题n=8、k=2,要计算的是f[7]。由最后一轮的合法区间可得j=4,所以f[7]依赖f[4];同理,f[4]依赖f[2],f[2]依赖初值f[0]。按这一依赖顺序计算:
| i | 内层循环结束后的j | 本轮增加的一组 | 递推结果 |
|---|---|---|---|
| 2 | 0 | a[1]至a[2]:1,3 | f[2]=f[0]+1=1 |
| 4 | 2 | a[3]至a[4]:5,7 | f[4]=f[2]+1=2 |
| 7 | 4 | a[5]至a[7]:8,9,10 | f[7]=f[4]+1=3 |
例如最后一轮中,10−a[4]=3>2,而10−a[5]=2,故末组从下标5开始,j=4。程序输出3。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_jinhuashixiao_q012
