套餐分配
某校学生就餐实行套餐制,套餐分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