第 14 题
答案与解析
第(1)小题
cnt += flag[i]
flag[i + 11]
start_time = i
程序分析
n = len(a)
flag = [0] * n
for i in range(n):
if a[i][2] > std:
flag[i] = 1a按时间先后保存采集记录,每项的下标2对应烟雾浓度。flag先全部置0,再把烟雾浓度严格超过std的记录对应的标记改为1。因此flag[i]为1表示第i个采集时刻是异常波动点,为0表示不是;浓度恰好等于基准线时不标记为异常。
start_time = cnt = 0
for i in range(12):
①
max_cnt = cntstart_time和cnt的初值均为0,循环依次访问下标0至11的记录;循环后的cnt被赋给max_cnt,作为下一段比较的初始值。
for i in range(1, n - 11):
cnt = cnt - flag[i - 1] + ②
if cnt > max_cnt:
max_cnt = cnt
③i依次取1至n−12。cnt的更新式先减去flag[i−1],再加上空②的值;随后比较cnt与max_cnt,只有cnt更大时才将其保存到max_cnt。结合题目寻找异常点最多时段的要求,cnt需要表示当前12点时段的异常点数,max_cnt记录已经考察的时段中的最大数量。
if max_cnt > 0:
print("异常点最密集时段的起始时间:", a[start_time][0], "时", a[start_time][1], "分")
else:
print("未发现异常点")输出语句用a[start_time][0]和a[start_time][1]取得小时和分钟,因此start_time需要保存所求时段起始记录的下标。max_cnt为0时,程序输出“未发现异常点”。
填空分析
①
第一个时段包含下标0至11的12条记录,后续要用它的异常点数初始化max_cnt。flag[i]为1表示异常,为0表示正常,标记之和就是异常点数。cnt已初始化为0,循环中应累加当前标记:
cnt += flag[i]
②
按题意,每个时段包含连续12个采集点。起点由i−1移到i后,范围从i−1至i+10变为i至i+11。已知语句减去flag[i−1],移除了原时段最左端的标记,因此空②应补入新时段最右端的标记:
flag[i + 11]
最后一次i=n−12,新加入的下标为n−1,恰好对应当天最后一条记录。
③
进入该分支时,当前时段的异常点数超过此前最大值,已知语句更新了max_cnt。输出还要使用这一时段的起始记录下标,因此应同时保存当前起点i:
start_time = i
程序按起点从早到晚考察,条件cnt > max_cnt使数量相同时不更新,从而保留最早的时段。
第(2)小题
B
程序分析
flag = [0] * n
for i in range(n):
if a[i][2] > std:
flag[i] = 1flag的各元素初值均为0。range(n)使每个下标i恰好被访问一次,只有该记录的浓度超过std时才执行加框语句。
改为flag[i] += 1后,异常点对应的标记由0加1变为1;正常点不执行该语句,标记仍为0。两种写法生成相同的flag列表,后续统计与输出不变。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_ningboermo_q014
