第 13 题
答案与解析
第(1)小题
8
前5批放置后,第1层的1~7号柜已占用,空柜分成0号和8~9号两段。第5批未能放置,不改变柜子的占用状态。
按编号顺序寻找可容纳2件快递的同层连续空柜:0号只有1个空柜,不满足要求;8~9号恰有2个连续空柜,可全部用于存放,无须再向后偏移。因此,第6批的起始柜子编号为8。
第(2)小题
a[i]
p+1
p+a[i]
程序分析
for i in range(len(a)):
p = getPos(①)
if p != -1:
k = (flag[p] - a[i])//2
...
else:
print('不能放置')列表a保存各批快递的数量,外层循环按批次处理。getPos返回第一个足够长的同层连续空柜区域的起始编号,找不到时返回−1,程序输出“不能放置”。
找到区域后,flag[p]是该区域的长度。减去本批数量a[i],得到放置后剩余的空柜数;再整除2,得到居中放置时前方保留的空柜数k。若剩余数为奇数,后方会比前方多留1个空柜。
for j in range(k,0,-1): # 修改居中位置前空快递柜子的flag值
flag[p] = j
p = ②j依次取k、k−1、…、1,flag[p] = j把当前位置开始的连续空柜数改为j。按注释,这段循环处理居中位置前保留的空柜。
for j in range(p,③): # 修改已存放快递柜子的flag值
flag[j]=0flag[j]=0表示第j号柜已被占用。本段从p开始修改记录,右端点由③限定;占用区后方的空柜记录保持不变。
填空分析
①
当前批次编号为i,待存放数量是a[i]。getPos的参数是所需连续空柜数,因此填a[i]。
②
从区域起点开始,每更新一个前方空柜,就应让p向后移动一格,因此②填p+1。循环执行k次后,p增加k,指向本批快递的存放起点;k=0时循环不执行,起点仍为原来的p。
③
此时p为实际存放起点,本批共a[i]件,占用编号p到p+a[i]−1。range不包含右端点,所以终止值填p+a[i]。
注意:原卷注释写flag[9]=0,但按“从该位置开始同层连续空柜数”的定义,初始全空时9号柜自身仍是空柜,故应为1。这里按字段定义理解,三处填空不受该笔误影响。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_jiyangliankao_q013
