第 15 题
答案与解析
第(1)小题
7
单子[0,2,5,5,5,9]的起点是[5,5],终点是[5,9]。骑手应先从当前位置[8,5]到[5,5]取货,再送到[5,9],两段行程分别为3和4,总行程为3+4=7。
第(2)小题
abs(pos[1]-new[1])
程序分析
def dis(pos,new):
x=abs(pos[0]-new[0])
y=
d=int((x*x+y*y)**0.5)
return dpos和new分别保存两个位置的坐标。程序先计算横坐标差x,再用xx+yy的平方根计算距离,最后通过int取整返回。
填空分析
y=<blank/>
按直线距离公式,y应与x对应,保存两个纵坐标差的绝对值。纵坐标位于下标1,因此填:
abs(pos[1]-new[1])
第(3)小题
len(on)==0
new[num][0]+30
pos=on[0][4:6]
程序分析
# 注:a=b.pop(i)表示把列表b索引i的元素删除,数据存到变量a
on=[] # 在手上未完成的外卖单
new=[] # 等待接单的外卖单
def Takeout():
time=600 # 早上10点开始上岗接单
c=0; pos=[20,20]
while time<1200: # 20点结束接单
# 生成足够多新的单子保存在new中,部分会被其他骑手接走,代码略
if ①:
...
elif len(on)==1:
...
else:
...on保存手上未完成的订单,new保存等待接单的订单。每条记录的下标0是生成时刻,下标1是编号,切片[2:4]是取货坐标,[4:6]是送达坐标。Takeout从time=600、pos=[20,20]开始,time以分钟计,pos记录当前位置;while在time<1200时持续处理,内部按在手订单数选择分支。
if ①:
# 找到最合适的待配送单(编号n),当前位置到单子出发点时间t,代码略
on.append(new.pop(n))
time=time+t
pos=on[0][2:4]new.pop(n)取出并删除选中的待接订单,on.append将其加入在手列表。随后time增加t,pos更新为on[0]的取货坐标。
elif len(on)==1:
mind=1000 # 记录最佳顺路单的总行程
for i in range(len(new)): # 寻找当前位置最佳顺路单
d=dis(pos,new[i][2:4])
d2=dis(new[i][2:4],on[0][4:6])
d3=dis(on[0][4:6],new[i][4:6])
if (d+d2+d3)<mind:
mind=d+d2+d3
num=i
if mind/5+time < ②:
on.append(new.pop(num))
pos=on[1][2:4]
time=time+dis(on[0][2:4],pos)//5 # 更新当前时间(取整)
else: # 当前没有符合条件的新单可接
# 时间time+1,往目标位置移动后更新pos坐标,代码略手上已有1单时,循环枚举待接订单。三段距离分别是:d从当前位置到新单取货点,d2从新单取货点到首单终点,d3从首单终点到新单终点,顺序对应“取新单→送首单→送新单”。
每当三段总距离更小,就更新mind并用num保存该候选在new中的下标。因此搜索结束后,mind记录找到的最短总行程,num用于访问对应的新单。下方用mind/5+time估计送完该新单的时刻,并用②作时间限制。
条件成立时,把该订单从new转移到on,放在on[1],并将pos改为它的取货点;不成立时,按省略代码继续向当前配送目标移动。
这里的固定语句用dis(on[0][2:4],pos)//5更新时间,计算的是首单取货点到新单取货点的耗时。若骑手此前已向配送目标移动,该起点就与接第二单前的当前位置不符,应在覆盖pos前用原当前位置计算耗时。
else:
③
d=dis(on[1][2:4],on[0][4:6])
time=time+d//5
on.pop(0)d计算第二单取货点到首单终点的距离,time累加这段配送时间;随后on.pop(0)删除首单,使原来的第二单移到on[0]。
填空分析
①
规则2要求当前无单时接入首单,on为空,即长度为0,因此①填:
len(on)==0
②
mind/5+time是预计完成候选新单的绝对时刻;new[num][0]是该新单的生成时刻,所以其30分钟截止时刻为:
new[num][0]+30
应使用new[num],因为该订单此时还没有被pop转移到on中。原程序已写定比较符号<,按此填空只接受早于截止时刻的订单;文字“不超过30分钟”若包含恰好30分钟,比较符号应为<=,仅填此空不能消除这一边界差异。
③
填好①后,最后一个else对应手上已有2单。该分支完成首单配送,③应把当前位置更新为首单终点;此时尚未执行on.pop(0),首单仍位于on[0],因此填:
pos=on[0][4:6]
后面的d由订单坐标计算,不读取pos,故先更新pos不影响这段距离的计算。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_jiyangliankao_q015
