火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

选取物品

作者: 作者的头像   huolong , 时间:2024-08-02 15:36:43 , 所有人可见, 阅读  2

学校物品室有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

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码