深耕专业教研,探索前沿技术
信息技术来源:2026年5月浙江省普通高中适应性考试(义乌柯桥)

第 14 题

答案与解析

第(1)小题

参考答案

7月到12月

表中各月溶解氧均不低于6 mg/L。3月、6月、8月的水温分别为19℃、18.9℃、19.0℃,属于可容忍月份,其余月份均为适宜月份。

一个区间最多包含1个可容忍月份。分别保留这3个可容忍月份,将区间向两端延伸,直到再延伸就会包含另一个可容忍月份:

包含的可容忍月份 可延伸到的最长区间 月份数
3月 1月到5月 5
6月 4月到7月 4
8月 7月到12月 6

完全不含可容忍月份的连续区间,都包含在上述某个区间中,不会更长。因此最长区间为7月到12月,共6个月,其中只有8月为可容忍月份。

第(2)小题

参考答案
  1. cnt = 0

  2. not ok

  3. cur_len = j - i + 1

程序分析

oxys = df1['溶解氧(mg/L)']; temps = df1['水温']; oks = df1['适宜']
best_st = -1
best_len = 0
i = 0
①
pos = -1    #可容忍月份的位置
for j in range(12):
    oxy = oxys[j]; temp = temps[j]; ok = oks[j]
    valid = True    #标记当前月份是否可以纳入窗口
    ...

oxys、temps、oks分别取自df1的溶解氧、水温和“适宜”列。按题意,12行依月份顺序排列,下标0到11对应1月到12月。j从0开始逐月遍历,oxy、temp、ok取得当前月的数据;每轮先将valid设为True,后续分支再判断是否需要排除当前月。

if ②:
    if oxy >= 6 and 18 < temp <= 20:
        cnt += 1
        if cnt > 1:
            i = pos + 1
            cnt = 1
        pos = j
    else:
        i = j + 1
        cnt = 0
        valid = False

进入空②控制的分支后,内层条件判断当前月是否可容忍。若可容忍,cnt增加1;当cnt超过1时,i移到上一个可容忍月份pos的后一位置,排除旧的可容忍月份及其之前的月份,再将cnt设为1,pos更新为当前下标j。因此cnt记录当前窗口中可容忍月份的数量,pos记录其中最近一次可容忍月份的下标。

内层条件不成立时,i移到j+1,cnt清零,并将valid设为False,本轮不再用当前窗口更新结果。由这些移动可以确定,i是窗口的起始下标,j是当前扫描到的结束下标;遇到不能纳入的月份后,窗口从下一月重新开始。

if valid:
    ③
    if cur_len >= best_len:
        best_st = i
        best_len = cur_len

只有valid为True时才计算当前窗口长度。随后将cur_len与best_len比较,并用i和cur_len更新记录,可确定best_st保存已记录区间的起始下标,best_len保存其长度。

print('适宜生长的最长月份区间是', best_st+1, '月~', best_st + best_len, '月')

下标比实际月份小1,所以起始月份为best_st+1。结束下标为best_st+best_len-1,转换为月份后是best_st+best_len。

填空分析

①

后续每遇到一个可容忍月份就执行cnt += 1。遍历开始前尚未纳入任何月份,可容忍月份数量应为0,因此填写:

cnt = 0

②

适宜月份可以直接纳入窗口;只有ok为False时,才需要进一步判断它是否可容忍,否则就排除该月并重新开始窗口。因此填写:

not ok

也可填写ok == False。

③

当前窗口从下标i到j,包含两个端点,共j-i+1个月,因此填写:

cur_len = j - i + 1

原程序还存在一处不属于填空的错误:if cur_len >= best_len在长度相等时也会覆盖已记录区间。由于月份按先后顺序扫描,这会保留较晚的区间,与题干要求相反。例如,仅1—2月和4—5月适宜,其余月份均不可纳入时,原程序输出4—5月,而题意要求1—2月。要满足等长时取较早区间,应仅在当前长度更大时更新。上述三个填空不能消除这一固定条件造成的问题。