图 1 | 图 2 |
def sort(): for i in range(3): for j in range(3,i,- 1): if waitlist[index[j]][1] > waitlist[index[j - 1]][1]: index[j], index[j - 1] = index[j - 1], index[j] if waitlist[index[j]][1]==0: return j return 4 waitlist=[[3,6],[4,0],[1,2],[2,4]] # "咖啡 0" 的批量制作时间为 3 分钟,目前待做量为 6,以此类推 q=[[6, 0, 2, 4], [1, 18, 0, 2], [2, 1, 2, 1], [0, 1, 0, 5],…… #如图 1,代码略 #q 保存订单流,第一个订单[6,0,2,4]作为初始订单已计入 waitlist index=[0,1,2,3] y=sort() lnk=[- 1]*4 for i in range(y- 1): #创建降序链表 lnk[index[i]]=index[i+1] p=lnk_h=index[0] print("请制作咖啡"+str(p)) waitlist[p][1]=0 #咖啡 p 进入制作,待做数量回 0 |
defenqueue(order): #order 是一个订单,例如[1,2,0,3] global lnk_h flag.append([0,0,0,0]) #新订单 4 种咖啡未完成 for i in range(4): f = True if waitlist[i][1]==0: f=False if order[i]==0: continue waitlist[i][1]+=order[i] #将订单 order 中的咖啡 i 累加到待制作数量中 cur=lnk_h while cur!=- 1 and waitlist[i][1]<waitlist[cur][1]: pr,cur=cur,lnk[cur] if cur!=i: tmp = lnk[i] lnk[i]=cur if cur==lnk_h: lnk_h=i else: lnk[pr]=i if f: while cur!=i: pr,cur=cur, lnk[cur]
def nextfood(qhead,qtail): #找到下一次要做的咖啡 global lnk_h cur=lnk_h while : pr,cur=cur,lnk[cur] if cur==lnk_h: lnk_h=lnk[lnk_h] elif cur==- 1: return – 1 else: lnk[pr]=lnk[cur] waitlist[cur][1]=0 for i in range( ): if q[i][cur]!=0: flag[i][cur] = 1 return cur qhead,qtail=0,1 order=q[qhead] flag=[[1,0,0,0]] #flag[i][j]=1 标记"订单 i" 中的"咖啡j" 已经在做或已经做完。 lnk_h, time =lnk[lnk_h],0 while True: time=(time+1)%waitlist[p][0] if qtail<len(q): enqueue(q[qtail]) #接新订单 qtail+=1 if time==0: while qhead<qtail- 1 and sum(flag[qhead])+q[qhead].count(0)==4: #订单完成时 qhead+=1 order=q[qhead] p=nextfood(qhead,qtail) if p == - 1 : break print("请制作咖啡"+str(p)) |