第 13 题
答案与解析
第(1)小题
1
本问按相邻两次实际采集值比较,第一次采集尚无前一次数据。前3次采集均有人,其中相邻位置差值为1.6−1.2=0.4米、2.1−1.6=0.5米,连续两次都大于0.3米,在第3次采集时触发一次开灯。开灯后只要没有检测到无人,灯就保持亮,不重复计算开灯次数。
第4次p=0,立即关灯。第5次重新有人,位置相对上一次的差值为0.5−0=0.5米;第6次的差值为0.7−0.5=0.2米,不满足“大于0.3米”,连续计数中断,不能再次开灯。因此共开灯1次。
第(2)小题
s = 0
p[i] == 1 and d > 0.3
pre = pos[i]
程序分析
n =len(p) # 采集次数
s = 0 # 灯状态:0灭,1亮
c = 0
pre = 0 # 存储上一次位置值
t = 0
for i in range(n):
if s == 1 and p[i] == 0:
...
elif s == 0:
...
③s表示灯的状态,初始为0;pre保存上一次位置,初始为0。循环按i依次处理采集数据:灯亮且无人时进入第一个分支;灯灭时进入elif分支;灯亮且有人时两个分支都不执行,保持亮灯。③位于两个分支之后,每轮都会执行。
if s == 1 and p[i] == 0:
①
c = 0这一分支对应“灯亮时检测到无人”的情况。①之后的c=0清除此前的计数,避免将关灯前后的检测过程接在一起。
elif s == 0:
d = abs(pos[i] - pre)
if ②:
c += 1
if c >= 2:
s = 1
t += 1
c = 0
else:
c = 0灯灭时,d记录当前位置与上一次位置之差的绝对值。②成立就使c加1,不成立则由else将c清零,因此c用于累计连续满足开灯检测条件的次数。达到2次时令s=1,并使t加1,t由此记录从灭灯变为亮灯的次数。
此处按原卷缩进,c = 0位于if c >= 2内部,成功开灯后才清零;若将它放在该if外,每次累加后立即清零,便无法累计到2。
填空分析
①
进入该分支时灯亮且检测到无人,应立即将灯状态改为灭。s=0表示灯灭,因此填写s = 0。后面的c=0负责清除连续计数,不能代替灯状态的修改。
②
外层elif已经限定灯灭,当前检测还必须同时满足“有人”和“相邻位置差值大于0.3米”。分别写为p[i] == 1和d > 0.3,用and连接,填写p[i] == 1 and d > 0.3。
不能只判断d:从有人变为无人时,pos变为0,也可能产生较大的位置差,但不能计入开灯条件。差值等于0.3米时也不满足题目要求。
③
本轮差值判断完成后,要把当前位置保存为下一轮的“上一次位置”,填写pre = pos[i]。该句每轮都执行,包括无人和灯亮的情况;这样pre始终对应紧邻的上一次采集,而不是上一次有人或上一次灯灭时的位置。
与第(1)问从两次实际采集开始比较不同,本程序以pre=0作为初始比较基准,首次采集的差值也参与判断:前两次差值分别为1.2米、0.4米,第2次便开灯。第4次关灯,之后未再满足连续两次条件,最终t仍为1。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_jiaxingermo_q013
