尾声麦当劳代码讲解和协助

概要设计报告
WeChat :help-assignment
1、 总体设计
麦当劳和它的点餐系统在07:00:00开始工作,点餐系统在22:00:01关闭。麦当劳一共有N种食物和M种套餐类型。每种套餐中包含多种食物。具体配置信息将在菜单文件(dict.dic)中提供。对于制作和存储每种食物,规定第i种食物在ti秒内完成,其最大存储容量为capi,表示该种食物最多可以存储capi个。麦当劳系统每天开放前,所有食物存储容量都为0,在任何时间点如果某种食物的存储量小于capi ,则会立即制作该食物,直到达到capi 。其中,不同种类食物可以同时制作,同种类食物只能依次制作。从07:00:00到22:00:00(含),学生可以在系统中点餐(如果系统未关闭)。每天(只有一天)按照顺序有n个订单,第i个订单发生在时间ai :bi :ci 。第i个订单要求一份typei (typei ∈Mcombo∪Nfood,其中Mcombo和Nfood分别表示全体的套餐和食物的集合)类型的套餐或食物。如果点餐时系统关闭,会导致点餐失败。22:00以后如果还有之前的订单未完成,则麦当劳会继续加班,且保证23:59:59(含)前一定能完成所有订单。在每一秒的开始,如果有新的食物完成,则首先存储食物,然后接受订单(如果存在)。
订单按照“先来先到,异步处理”原则进行处理。先来先到:指的是对于有存量的食物,总会被分配给时间最早的订单(套餐或单点);异步处理:指的是当一个订单(套餐或单点)因为请求的食物没有被全部满足时,不必等待该订单完成,可以直接处理下一个订单。食物一旦被分配给订单,就不能撤销。食物被分配给订单后,即便该订单尚未完成,该食物也不再占用对应类型的容量。当订单(套餐或单点)中要求的所有食物,均已被分配给该订单,则该订单会立刻完成。
如果在某个时刻t0,有人下了一个订单,并且该订单无法立刻完成,导致未完成订单的数量大于W1,则系统立即自动关闭(不再接受订单),但该订单仍然算作成功下单。如果在某个时刻t1,未完成订单的数量小于W2,则系统将在1秒后重新打开。即系统可以接受t1+1时刻的订单,而不能接受t1时刻的订单。
第一行包含一个整数n(1≤n≤54001)表示订单个数。第二行包含两个整数W1,W2(2≤W2≤W1≤100)。第三行包含N个整数t1, t2,…,tN(1≤ti≤70),其中ti表示第i种食物的制作时长。第四行包含N个整数cap1,cap2,…,capN (1≤capi≤n),其中capi表示第i种食物的最大存储容量。对于接下来的n行,用格式类似于11:11:11的方式,给出第i个订单的时间。然后输入一个字符串typei,(typei ∈Mcombo∪Nfood)表示套餐或食物的名称(参见dict.dic)。
5. 测试用例保证订单时间在[07:00:00,22:00:00]内,同一个时间点不可能出现多个订单,第i-1个订单一定早于第i个(2≤i≤n),且23:59:59(含)前麦当劳一定能完成所有订单。具体见input.txt。

输出输出包括n行,按照订单顺序输出订单完成时间。对于第i行,如果第i个订单不成功,则输出Fail。否则,输出这个订单完成的时间。时间格式与输入格式(11:11:11)一致。具体见output.txt。

算法设计程序先从文件读取食物信息,套餐信息,以及订单信息。 从早上7:00:00开始,遍历每一秒钟,每一秒钟做如下过程: 1) 遍历每一个食物:如果该食物存量已达到库存上限,则什么都不做,否则,将剩余生产时间减1,如果剩余生产时间为0,则库存增加1,并将剩余生产时间恢复为该食物的生产时间。 2) 遍历每一个订单:a) 如果系统当前时间大于等于该订单抵达时间,且该订单状态为未抵达状态,则做如下操作:● 若系统运行状态run(初值为1)为停止接单状态(run=0),则将该订单的状态置为失败(fail)。● 若系统运行状态为开始接单状态(run=1),则将该订单的状态置为制作中(ungoing),并且将已接订单数(记为R1,初值为0)增加1。b) 如果系统当前时间大于等于该订单抵达时间,且该订单状态为正在制作中的状态,则做如下操作:● 遍历所有有库存的食物,如果该订单有这个食物的需求,则将该食物供给这个订单,即食物库存减1,订单将对该食物的需求移除。如果该订单没有这个食物的需求,则忽略该食物。● 查看该订单的需求是否已全部完成,若已全部完成,则将该订单的状态置为success,并且将已完成订单数(记为R22,初值为0)增加1。否则,无需操作。c) 如果系统当前时间大于等于该订单抵达时间,且该订单状态为失败状态,或为已完成状态,则不用做任何操作;d) 如果系统当前时间小于该订单抵达时间,则无需做任何操作。 3) 检查系统状态:检查R2-R1是否大于W2,若是,则关闭接单系统(run=0)。否则,检查R2-R1是否小于W1,若是,则 开启接单系统(run=1)。否则,系统状态不发生变化。若当前时间大于22:00:00则关闭接单系统(run=0)。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值