学校物品室有n个箱子(箱子上分别有编号 1、2、3…),箱子里存有数量不一的物品。有m 位学生前来领取物品(物品总量足够领取),每位学生优先从物品数量最多的箱子领取,数量不够时,再从下一个数量最多的箱子领取。 如:物品数量 a=[5.9.2.12.3.5],各学生需要领取数量 b=[20.6.7.2] - 第1位同学领取物品的箱子编号依次为4、2 - 第2位同学领取物品的箱子编号依次为1、6 - 第3位同学领取物品的箱子编号依次为6、5 - 第4位同学领取物品的箱子编号依次为3 - 2号箱子剩余个数:1 回答下面问题: (1)如果1号到5号箱子的物品数量分别是25,16,9,5,3,每位学生需要的物品数量分别是 19,18,10,3,则第3位学生领取物品的箱子编号按顺序依次是3号、____号。
(2)实现上述功能的Pvthon程序如下,请在划线处填入合适的代码。
a = list(map(int,input().split()))
b = list(map(int,input().split()))
n = len(a)
m = len(b)
c = list(range(n))
for i in range(n-l):
for j in range(n-1,i,-1):
if _____(1)_____ :
c[j],c[j-1] = c[j-1],c[j]
p = q = 0
for i in range(m):
num = 0; s=""
while num<b[i]:
num += a[c[q]]
a[c[q]] = 0
_____(2)_____
for j in range(p,q):
s = s + " " + str(c[j]+1)
print("第%d 位同学领取物品的箱子编号依次为%s"%(i+1,s))
if num>b[i]:
a[c[q-1]] = _____(3)_____
q = q-1
for j in range(_____(4)_____, n-1):
if a[c[i]]<a[c[j+1]]:
c[j],c[j+1] = c[j+1],c[j]
p = q
for i in range(n):
if a[i]>0:
print("%d 号箱子剩余个数:%d" % (i+l,a[i]))
代码如下:
(1)a[c[j-1]] < a[c[j]]
(2)q += 1
(3)num – b[i]
(4)q
总结: 本题出现了用冒泡实现的索引排序,数据修改后用冒泡式插入维持有序 代码中使用了p、q两个指针来定位某次取物的范围,p是开始位置是内边界,q是结束位置是外边界。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com