第 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)小题
s[i] += q[i2]-q[i2+1]
k[i] += 1
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,仍可能再次触发限流。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_05_G3_xianyujiaoyan_q014
