深耕专业教研,探索前沿技术
信息技术来源:浙江省县域教研联盟高三年级5月高考模拟考试

第 11 题

答案与解析

本题解析

参考答案

C

程序分析

stk = [0] * len(a)
top, sum_val, min_avg = -1, 0, 8
for i in a:
    ...

程序先创建与 a 等长的列表 stk,将 top、sum_val、min_avg 分别初始化为 −1、0、8,再用 i 依次读取 a 中的每个元素。每轮先更新 stk 中的有效元素,再计算平均值。

if top != -1 and abs(i - stk[top]) < k:  # abs函数求绝对值
    sum_val -= stk[top]
    top -= 1
else:
    top += 1
    stk[top] = i
    sum_val += i

满足条件时,程序减去 stk[top] 并将 top 减1;否则先将 top 加1,再把当前元素 i 写入 stk[top] 并累加到 sum_val。写入和删除都发生在有效区的末端,因此 stk 模拟栈,top 是栈顶下标,−1 表示空栈,sum_val 记录栈内元素之和。

栈非空且当前元素与栈顶元素的差的绝对值小于 k 时,原栈顶出栈,当前元素不入栈;其余情况将当前元素入栈。每轮最多出栈一次。

if top != -1:
    avg = sum_val / (top + 1)
    if avg < min_avg:
        min_avg = avg

非空栈的有效下标为0到 top,共 top+1 个元素,因此 avg 是当前栈内元素的平均值。只有 avg 小于 min_avg 时才更新,min_avg 保留各轮非空栈平均值与初值8中的最小值;空栈时跳过计算,保留此前结果。

选项分析

A

不符合。k=0 时,差的绝对值不可能小于0,所有元素依次入栈。各轮平均值依次为 5、5、16/3、5、24/5、31/6、34/7、37/8、5、47/10,最小值为 37/8=4.625。

B

不符合。k=1 时,整数差的绝对值小于1即两数相等,第二个5、第二个4、第二个3分别使相同的栈顶出栈。各轮非空栈(栈底→栈顶)依次为 [5]、[6]、[6,4]、[6]、[6,7]、[6,7,3]、[6,7]、[6,7,8]、[6,7,8,2],平均值均不小于5,最小值为5.0。

C

符合。k=2 时,相等或相差1都会触发出栈。按题给顺序处理:

当前元素 本轮操作 栈(栈底→栈顶) min_avg
第1个5 入栈 5 5.0
第2个5 5出栈 空 5.0
6 入栈 6 5.0
第1个4 与6相差2,入栈 6,4 5.0
第2个4 4出栈 6 5.0
7 与6相差1,6出栈 空 5.0
第1个3 入栈 3 3.0
第2个3 3出栈 空 3.0
8 入栈 8 3.0
2 与8相差6,入栈 8,2 3.0
D

不符合。k=3 时,第一个4使6出栈,第二个4在空栈中入栈,将最小平均值更新为4.0。随后7、3依次入栈,第二个3使栈顶3出栈,8使栈顶7出栈,最后2使栈顶4出栈。这一阶段非空栈的平均值依次为4、11/2、14/3、11/2、4,最终 min_avg 为4.0。