第 15 题
答案与解析
第(1)小题
2
同品牌车辆集中排列,品牌组之间按首次进入当前队伍的先后顺序排列。码头开放前的队伍为 1、5、2、4、3、6。题目将正在装载的车辆也计入前方车辆数,因此每轮先让新车入队并计数,再让队首车辆离开。
| 新到车辆 | 入队后的队伍(队首→队尾) | 新车前方车辆数 | 本轮离开的车辆 |
|---|---|---|---|
| [7,0] | 1,5,7,2,4,3,6 | 2 | 1 |
| [8,0] | 5,7,8,2,4,3,6 | 2 | 5 |
| [9,2] | 7,8,2,4,3,6,9 | 6 | 7 |
| [10,2] | 8,2,4,3,6,9,10 | 6 | 8 |
| [11,1] | 2,4,11,3,6,9,10 | 2 | 2 |
11 号车到达时,0 号品牌的车辆已经全部离开。11 号车插入品牌 1 的末尾,其前方是 2、4 号车,共 2 辆。
第(2)①小题
tail[brand]=p
程序分析
def arrive(car, brand, p):
global h, t
front = 0
for b in order[h:t]:
if b == brand:
break
front += length[b]
front += length[brand]题目规定 data 的每个结点保存 [车辆编号,品牌,同品牌下一辆车索引],各品牌分别用链表连接自己的车辆。order[h:t] 保存当前仍有车辆的品牌及其排队顺序,h 指向队首品牌,t 指向下一次写入品牌的位置;length[b] 记录品牌 b 的车辆数。
for 循环按品牌顺序累加排在 brand 前面的各品牌车辆数,遇到 brand 时停止;随后加上 length[brand],把同品牌的已有车辆也计入 front。这些车辆都排在新车前面。若当前没有该品牌,循环遍历全部有效品牌,而 length[brand] 为 0,得到的就是全队车辆数。
if head[brand] == -1:
head[brand] = p
tail[brand] = p
order[t] = brand
t += 1
else:
data[tail[brand]][2] = p
length[brand] += 1
return fronthead[brand]、tail[brand] 分别保存该品牌链表首、尾结点的下标,−1 表示空链表。品牌原来没有车辆时,将二者均设为新结点下标 p,并在 order[t] 登记该品牌,再让 t 增加 1,使新品牌排到品牌队列末尾。
品牌已有车辆时,data[tail[brand]][2]=p 将原尾结点的后继改为新结点;data[p][2] 初值为 −1,新结点没有后继。两条分支汇合后,length[brand] 增加 1,并返回入队前已算出的 front。
填空分析
划线处
原尾结点已经连到新结点 p,此时 p 成为该品牌链表的尾结点,因此还需把尾指针更新为 p,填写 tail[brand]=p。否则下一辆同品牌车辆到达时,仍会修改旧尾结点的后继,覆盖本次建立的链接。
第(2)②小题
能
共用程序分析见第(2)①小题。
填空分析
加框处
head[brand]==−1 表示该品牌链表为空,length[brand]==0 表示该品牌没有车辆。在头指针和车辆计数均按程序规则维护时,两者描述同一状态,因此能替换。这里的判断发生在新车插入及 length[brand] 增加 1 之前。
第(3)小题
head[brand]=data[p][2]
h += 1
程序分析
h = t = 0
head = [-1] * m; tail = [-1] * m; length = [0] * m
m = 3 # 品牌数量
n = 100 # 定义数组order的长度,即品牌顺序队列的最大容量,假设100足够大
order = [0] * nh=t=0 表示品牌顺序队列初始为空;各品牌的头、尾指针初值为 −1,车辆数初值为0。order 保存品牌的排队顺序。
原代码应先定义 m,再创建三个品牌列表;若此前没有定义 m,列表初始化会报错。以下按 m=3、品牌列表已正确初始化分析。
def leave(): # 队首车辆离开
global h
brand = order[h]
p = head[brand]
①
length[brand] -= 1
if head[brand] == -1:
tail[brand] = -1
②
returnbrand=order[h] 取得队首品牌,p=head[brand] 取得该品牌首结点的下标,因此 p 指向本次离开的车辆。执行空①后,length[brand] 减少1;若此时 head[brand] 为 −1,已有语句将尾指针设为 −1,再执行空②。
for i in range(start, len(data)):
vid = data[i][0]
brand = data[i][1]
front = arrive(vid, brand, i)
print("前面有" + str(front) + "辆车在队伍中")
left = leave()
show_queue() # 显示队伍中的车辆情况每轮先调用 arrive,使新车完成入队并计算 front;输出前方车辆数后,再调用 leave,让队首车辆离开。因此调用 leave 时队列非空,正在装载且尚未离队的车辆仍计入 front。
填空分析
①
p 是原首结点的下标,data[p][2] 保存它的同品牌后继结点下标。删除首结点只需让头指针指向这个后继,填写 head[brand]=data[p][2]。若原来只有一辆车,后继为 −1,更新后链表变空;data 中原结点的存储项无须删除。
②
该品牌已没有车辆,品牌顺序队列也应移到下一个品牌,填写 h += 1。若该品牌仍有车辆,就不进入此分支,h 保持不变,继续优先装载同品牌车辆。退出品牌留在 order 的旧存储位置不影响有效区间 order[h:t];以后该品牌再有车辆到达时,由 arrive 将其重新加入队尾。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_05_G3_zhenzhongmoni_q015
