当前位置: 高中信息技术 / 综合题
  • 1. (2023·浙江模拟) 某咖啡店,店里共有4种咖啡,类型编号为0到3,每次只能制作一种类型的咖啡,咖啡都是批量现做(制作过程中不能更改数量或类型)。店员需按照订单的先后顺序完成订单(即当前订单完成之前不能换订单),已经接到的订单中的同一类型咖啡可以一起制作(假设咖啡机能同时制作的数量上限足够高),且不需要额外增加时间(即只需制作一杯的时间)。如图1为每个订单的咖啡数量,初始“订单0”中[6, 0, 2, 4]表示0到3号咖啡的购买数量。此时店员先做数量最多的6份0号咖啡,1分钟后接到新订单[1, 18, 0, 2],之后每分钟都会接到1个新订单,这些订单都计入每种咖啡的待做数量。3分钟后这6份0号咖啡制作完成,程序会在“订单0”中选择还没制作的且待做数量最多的(数量相同时先后不作要求)咖啡作为下一次要制作的咖啡。编写python程序,每次制作完一种咖啡,输出接下来要制作的咖啡,运行界面如图2:

    图 1

    图  2

    1. (1) 由图1的订单信息,3 分钟后" 咖啡 0"制作完成,那么图2 中(1)处店员接下来要做的咖啡是咖啡
    2. (2) 根据待制作的咖啡数量,对链表初始化,生成降序链表 lnk,则代码运行后 y的值为

      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

    3. (3) 请在划线处填入合适的代码。

      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))

微信扫码预览、分享更方便