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

套餐分配

作者: 作者的头像   huolong , 时间:2024-08-02 15:27:32 , 所有人可见, 阅读  5

套餐分配

某校学生就餐实行套餐制,套餐分A、B、C、D、E、F、G、H共8种,学生可预订任意一种套餐。学校根据各套餐预订人数分配窗口,为提高配餐效率,一个窗口只提供一种套餐,学校学生数不超过 2000 人,窗口共30个,根据每窗口 70 人预分配窗口,但按此方法分配窗口数可能超过 30 个,则删除多余窗口,删除方法如下:每个套餐至少保留一个窗口,最多删除 1 个窗口,优先删除尾数窗口中人数最少的窗口,如果尾数窗口人数一样,则在分配到窗口数最多的套餐中去掉一个窗口例如:某次选择A~H套餐的人数分别为[468,329,392,248.38,180,263,82],则各套餐所需窗口数量分别为7、5、6、4、1、3、4、2,合计窗口 32个,需减掉2个,即从D和H套餐窗口各减去1个。如图所示:

实现上述功能的Python程序如下,请在划线处填写正确的代码。
#从数据库中读取每个学生所订套餐号存入列表a中,如a=['A','B','H','F'…]
tcs, rs, cks = 8, 70, 30    #套餐数量, 每个窗口预分配人数, 窗口数量
b = []
for i in range(tes):
    c = chr(i+65)  #A的ASCII码是6
    b.append([c,0,0])  # 生成二维列表 b=[['A',0,0],['B',0,0]…]
for i in a:
    b[ord(i)-65][1] += 1 #统计各套餐预订数量
s = 0
for i in range(tcs):
    b[i][2] = b[i][1] // rs           # b的结构  [[套餐名,选择人数,窗口数],……]
    if b[i][1]%rs!=0:  b[i][2] += 1
    _____(1)_____            #①
for i in range(tcs-1):
    for j in range(tcs-i-1):
        _____(2)_____       #②
        if t>0 or t==0 and b[j][2]<b[j+1][2]:
            b[j],b[j+1] = b[j+1],[j]
i = 0;  k = s - cks
while k>0:
    if _____(3)_____     :          #③
        b[i][2] -= 1
        k -= 1
    i += 1
k = 1
for i in range(tcs):
    c = chr(i-+65)
    for j in b:
        if j[0]==c:
            print(c+'套餐分配窗口为:'+str(k)+'~'+str(k+j[2]-1))
            _____(4)_____            #④


代码如下:

(1)s += b[i][2]
(2)t = (b[j][1]-b[j][2]*rs) – (b[j+1][1]-b[j+1][2]*rs) 
(3)b[i][2]>1
(4)k += j[2]

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

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


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



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





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

微信登录

微信登录二维码

正在生成二维码...

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

绑定手机号

📱

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

请您尽快绑定手机号码