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

第 14 题

答案与解析

第(1)小题

参考答案

4

每分钟的入场、离场数据,要到下一分钟开始时才用于更新车辆数。例如,第X+1分钟内的12辆入场、4辆离场,用于计算第X+2分钟开始时的车辆数。

计算时刻 当前车辆数 状态及限流判断
第X+1分钟开始 15 状态0,未达到限流条件
第X+2分钟开始 15+12−4=23 状态1,连续第1次
第X+3分钟开始 23+15−6=32 状态1,连续第2次
第X+4分钟开始 32+16−7=41 状态2,立即发送限流指令

第X+4分钟开始时车辆数已达到40,不必再等待状态1持续3分钟,因此填4。

第(2)小题

参考答案
  1. s[i] += q[i2]-q[i2+1]

  2. k[i] += 1

  3. flag[i] and s[i] <= 30

程序分析

n = 4  # 通道数
k = [0] * n
code = [-1] * n
flag = [False] * n
s = [0] * n  # 各通道初始车辆数为0
while True:
    ...
    for i in range(n):
        ...
    # 延时1分钟,代码略

程序每轮取得4个通道上一分钟的入场、离场数据,再由for循环逐通道处理。i取0~3,指向当前通道;s[i]从0开始保存该通道车辆数。一次循环结束后延时1分钟,再处理下一批数据。

①
if s[i] < 20:
    code[i] = 0
elif s[i] < 40:
    code[i] = 1
else:
    code[i] = 2

空①更新车辆数后,三个分支将车辆数划分为小于20、20~39、大于等于40,分别写入状态码0、1、2。后续通过code[i]判断当前通道是否缓行或拥堵。

if code[i] == 1:
    ②
else:
    k[i] = 0

只有状态码为1时才执行空②,其他状态直接将k[i]清零。结合后面的k[i] == 3可知,k[i]用于累计连续检测到状态1的次数;一旦状态不为1,原来的连续计数就失效。

if (code[i] == 2 or k[i] == 3) and not flag[i]:
    # 发送限流指令,代码略
    flag[i] = True
    k[i] = 0
elif ③:
    # 发送取消限流指令,代码略
    flag[i] = False

当状态为2或连续计数达到3,并且flag[i]为False时,程序发送限流指令,再将flag[i]设为True并清零k[i]。因此flag[i]记录该通道是否已经限流,not flag[i]用于避免在已限流期间重复发送限流指令。elif分支发送取消限流指令后把标志恢复为False,空③需要限定取消指令的发送条件。

填空分析

①

列表q按通道依次存放一对入场数、离场数,通道下标i从0开始,所以q[i2]为当前通道入场数,q[i2+1]为离场数。s[i]原来保存上一分钟开始时的车辆数,应在原值上加上这一分钟的净增加量,填写:

s[i] += q[i*2]-q[i*2+1]

这里必须累加,不能将车辆总数直接赋为本分钟的入场数减离场数。

②

空②位于code[i] == 1分支,每轮对应一次新的分钟统计,应将该通道连续缓行计数增加1;非缓行状态已有else分支负责清零。因此填写:

k[i] += 1

③

题干规定只有已限流且当前车辆数降至30及以下时才取消限流,两个条件必须同时满足,填写:

flag[i] and s[i] <= 30

发送后flag[i]变为False,在尚未再次限流时,不会重复发送取消指令。不能只按code[i]判断,因为状态1包含20~39,而其中31~39尚未达到取消限流的条件。注意20~30仍属于状态1;原程序在已限流期间也更新k[i],取消限流时未将它清零,所以之后若k[i]达到3,仍可能再次触发限流。