深耕专业教研,探索前沿技术
信息技术来源:湖州、衢州、丽水2026年4月三地市高三教学质量检测

第 12 题

答案与解析

本题解析

参考答案

A

程序分析

from random import randint
n=len(a)
stk=[0]*n
top=-1
s=0
for i in range(n):
    if a[i]==-1:
        if randint(0,1)==1 and top!=-1:  # randint(0,1)随机生成0或1
            s+=stk[top]
            top-=1
    else:
        top+=1
        stk[top]=a[i]

stk预先分配n个存储位置,top初值为-1,s初值为0。循环依次处理a中的元素:遇到非-1元素,先增加top,再把元素存入stk[top];遇到-1时,只有随机数为1且top不为-1,才把stk[top]加入s并将top减1,否则保持不变。

存入和取出都在top所指位置进行,后存入的元素先被取出,因此stk用来模拟栈,top为栈顶下标,-1表示空栈,s是已出栈元素之和。减小top即完成逻辑出栈,不需要清除数组中留下的旧值。

前两个-1分别出现在1和2之后。这一阶段可能都不出栈,只弹出1,只弹出2,或依次弹出1、2,所以累计和可能为0、1、2、3。

随后4、8、16依次入栈,新增部分按“栈底→栈顶”为4、8、16。末尾只有两个-1,至多出栈两次:不出栈时新增和为0;出栈一次只能弹出16;出栈两次依次弹出16、8,新增和为24。4及其下方元素均不会在这一阶段出栈。

两阶段组合得到:

末尾出栈次数 末尾新增和 最终s的可能值
0 0 0、1、2、3
1 16 16、17、18、19
2 24 24、25、26、27

选项中只有25在可能值内。例如四次随机数依次为1、0、1、1时,依次弹出1、16、8,得到s=1+16+8=25。