第 14 题
答案与解析
第(1)小题
A
12:05 属于 12~13 时段。1 号座位原来的预约 [1,8,11] 在 11 点结束,当前时段无人;取消 [1,13,14] 后,下一时段 13~14 也无人。根据“当前时段无人且下一时段无人”亮绿灯的规则,此时为绿色。
第(2)小题
k=p[0]
d[j]=2
d[j]=1
程序分析
h=[] ; t=[]
d=[0]*(n+1) #存储某时段各座位指示灯信号,0表示灯绿,1表示灯黄,2表示灯红
for i in range(ed+1):
t.append([]) #数组t存储各时段被预约的座位号主程序调用 creat(y,st,ed,n),传入预约单、开关门时间和座位数。函数先建立信号列表 d,用座位号作下标,d[1]~d[n] 分别保存各座位的信号,初值0表示绿灯。t 建立下标0~ed的空列表,其中 t[i] 用于保存 i~i+1 时段被预约的座位号。
for p in y:
for q in range(p[1],p[2]):
①
t[q].append(k)p 依次取得一条预约单,p[1]、p[2] 分别为到达和离开时间。q 从到达时刻取到离开时刻前一小时,恰好遍历这条预约覆盖的各个时段;t[q].append(k) 将 k 加入相应时段的列表。例如 [1,8,11] 对应 q=8、9、10,不包含从 11 点开始的时段。
for i in range(st,ed):
...i 从 st 遍历到 ed-1,每轮处理 i~i+1 时段。d 在循环外创建,各轮沿用同一个列表,所以需要在保存本轮信号前更新其中的旧状态。
for j in t[i-1]:
d[j]=0先把上一时段被预约的座位信号清为 0,消除上一时段占用状态的影响。即使同一座位本时段仍有人,也先清零,再由后面的当前时段处理更新。
for j in t[i]:
②
for j in t[i+1]:
if d[j]==0:
③先遍历当前时段的预约座位,再遍历下一时段的预约座位。后一步只处理 d[j]==0 的座位,因此不会覆盖前一步已设为非零的信号。两空需要按这个先后顺序落实亮灯规则。
h.append(d[1:])d[1:] 取出1~n号座位的信号,并生成新列表后加入 h,后续修改 d 不会改变已保存的信号。各行按时段先后排列,h[0] 对应 st~st+1 时段。
填空分析
①
t[q] 要存储被预约的座位号,而预约单 p 的第 0 项就是座位号。因此先将 p[0] 赋给 k,再由下一句加入 t[q]:
k=p[0]
②
j 来自 t[i],说明 j 号座位在当前 i~i+1 时段有人,应亮红灯。注释规定红灯信号为 2,因此填写:
d[j]=2
③
j 来自 t[i+1],说明下一时段有人。执行到这里,当前时段有人使用的座位已由②设为 2;只有仍为 0 的座位满足当前无人、下一时段有人的条件,应设为黄灯信号 1:
d[j]=1
上一轮的黄灯表示本轮有人,这些座位会进入 t[i] 并由②改为红灯;上一轮的红灯先被清零,再按本轮预约更新。因此,判断③时,d[j]==0 能对应当前无人,红灯也不会被下一时段的预约改成黄灯。
最后一个开放时段 i=ed-1 会访问 t[ed]。题目规定预约不超出开放时间,且 range(p[1],p[2]) 不包含离开时刻,所以 t[ed] 为空,不会把关门后的时段计为预约。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_05_G3_Z20_q014
