内容正文:
专题12 算法综合应用
1.【2023年1月浙江省选考真题信息技术第15题】有2组器件共n个,要用一台检测设备检测。每个送检器件的信息包含送达时间、检测时长和优先级。优先级有m(1<m<6)个等级,由高到低分别用0~m-1的整数表示。每个器件的送达时间各不相同。已送达的器件按照各优先级通道分别排队,先到达先入队。设备每次检测都从当前各非空队列中,选取优先级最高的队列的队首器件出队进行检测。
(同一时刻出现入队和出队时,先处理入队。)
编写程序模拟检测过程,先合并2组器件的数据,然后计算所有器件的平均等待时长,其中每个器件等待时长为其开始检测的时间与送达时间的时间差。(时间单位均为秒)
请回答下列问题:
(1) 由题意可知,第15题图中器件A、B、C、D的检测顺序为A-C-D-B,A、C、D的等待时长分别为0、1、0,B的等待时长是▲。
第15题图
(2)定义如下merge(lst1,lst2)函数,参数lst1和lst2的每个元素由送达时间、检测时长和优先级3项构成,lst1和lst2均已按送达时间升序排列。函数功能是将lst2中的元素合并到lst1中,并将lst1按送达时间升序排列,函数返回lst1。
def merge(lst1,lst2):
i = len(lst1)-1
j = len(lst2)-1
for t in range(len(lst2)):
lst1.append([0, 0, 0]) #为lst1追加一个元素[0, 0, 0]
k = len(lst1)-1
while j >= 0:
if i >= 0 and lst1[i][0] > lst2[j][0]:
lst1[k] = lst1[i]
i -= 1
else:
lst1[k] = lst2[j]
j -= 1
k -= 1
return lst1
①调用merge(lst1, lst2)函数,若lst1为[[0, 3, 2], [1, 1, 2], [12, 2, 2]], lst2为[[2, 1, 1], [4, 3, 0], [11, 3, 2]],则while语句中循环体的执行次数是▲。
②若函数中while语句的条件“j >= 0”误写为“k >= 0”,会导致某些情况下无法得到符合函数功能的结果。调用merge(lst1, lst2)函数,下列4组数据中能测试出这一问题的是▲(单选,填字母)。
A.lst1 = [[0,3,2],[4,3,0]] B.lst1 = [[1,1,2]]
lst2 = [[1,1,2]] lst2 = [[0,3,2],[4,3,0]]
C.lst1 = [[1,1,2],[4,3,0]] D.lst1 = [[4,3,0]]
lst2 = [[0,3,2]] lst2 = [[0,3,2],[1,1,2]]
(2) 实现模拟检测过程并计算平均等待时长的部分Python程序如下,请在划线处填入合适的代码。
def proc(data, m):
n = len(data)
queinfo = []
for i in range(m):
queinfo.append([-1,-1]) #queinfo追加一个元素[-1,-1]
for i in range(n):
data[i].append(-1) # data[i]追加一个元素-1
curtime = 0
waitnum = 0
i = 0
①
while i < n or waitnum > 0:
if i < n and data[i][0] <= curtime:
k = data[i][2]
if queinfo[k][0] == -1:
queinfo[k][0] = i
else:
②
data[p][3] = i
queinfo[k][1] = i
waitnum += 1
i += 1
elif waitnum > 0:
k = 0
while