但是如果一个订单来,会使得数量超,但是这一秒内刚好又能处理完成一个订单
那么就不会关闭要求是纯C写法:
0准备工作:就是审题,要想代码正确,审题就是关键,审题不明,代码无用。
1根据对题的理解,分析一下应当写哪些结构体,
食物的
套餐的
订单的
2就是读文件导数据了,这一步的操作,考察了对文件各种情况的读取,难点是读字符要先分析一下缓冲区是否有换行符,如果有应当取下来。
从文件取的数据,食物总数量,套餐总数量
主要是 食物名称,每个食物制作的时长,每个食物最大的存储上限,
订单超多少,梺止下单,订单低于多少又可以开启下单
然后是读取套餐名和 套餐元素,元素个数
3、从键盘开始录数据
第一步是共有多少个订单
第二步是每一个订单下的时间和订的名称
难点是,通过订单名称,如果是食物,直接存食物,如果是套餐,需要把套餐的元素加进来。
4、这是程序的核心,有了数据就要开始搞算法了。(后面单独说)
5、分析完了之后 ,打印每个订单的情况,这里要注意,打印的次序是按下单的时间次序打印,不是谁先完成打印谁。
此处直接说一下算法核心 :
这是一个类似队列问题,来了订单,入队列,这体现出了时间的先后次序。但要注意,哪个单子先完成,哪个单子先出队,这里可以理解为队列优先,而不是队头先出列。
出队的单子,标为完成。
由于是队列,就会有队列长度问题,如果长度大于阀值1,则关系统,如果长度小于阀值2,则开系统。其中要注意在关系统的时间可能有人下单,此时订单不需要入队列,直接标为失败即可。
由于 这里是模拟现实,以秒分析变化,哪就用一个循环,然后加上秒变化即可,需要说明的是在1秒变化中要做的事是这样的:
先加工所有需要加工的食物,食物库存不足,就根据制作时长,一秒一秒的来制作。
有一种情况,就是某时,所有食物库存全满,哪就不需要制作,写个函数直接返回0,说明此1秒没有加工。
分析食品是否可以入订单,如果可以入,分析订单是否完成。完成了,出队列,同时对应食品存量变化 。
分析现在系统是否开,开着此秒是否有下单。
出队和入队同时发生完了之后再分析是否开系统或关系统的事。【因为1秒发生的事是制作食品,完成否订单,和是否有下单】
其中上面有一种情况我们可以减少循环,就是此秒没有食物加工,也就是所有食品都达到了上限,并且队列长度为0,我们就可以直接让秒等于下一个要进来的订单时间。直接省了很多没有用的循环。
最后考虑接单子的最晚时间。
考虑最晚什么时候循环结束。
麦当劳售货任务,首先帮我提取这个任务的关键需求和约束条件,然后列出实现该任务所需的主要功能模块和实现步骤。
接着基于这些需求,设计系统架构并提供示例代码结构或伪代码,包括主要的类、方法和它们的职责。
问题描述:2023年5月,麦当劳在北邮开业。大量的学生去那里订餐。正因为如此,
麦当劳的在线点餐系统经常关闭以避免拥挤,尤其是在午餐和晚餐时间。该系统的关闭时间不确定。
北邮的学生认为这非常麻烦。 然而,北邮学生无所畏惧。
北京邮电大学最优秀的学生之一(也是北邮ICPC团队的一员)Zhai Xie (ThomasX)在飞书上开发了一个实时监控机器人,
它告诉我们麦当劳在线点餐系统的实时状态。有了这个机器人,北邮学生可以更方便地点餐。
在这个问题中,需要你像他一样完成这个任务,开发一个系统来模拟麦当劳的在线点餐系统。
北邮的麦当劳和它的点餐系统在07:00:00开始工作,在22:00:01关闭。
麦当劳一共有N种食物和M种套餐类型,每种套餐中包含多种食物,具体配置信息将在菜单文件 (dict.dic) 中提供。
对于制作和存储每种食物,规定第i种食物在t_i秒内完成,其最大存储容量为cap_i ,表示该种食物最多可以存储cap_i个。
麦当劳系统每天开放前,所有食物存储容量都为0,在任何时间点如果某种食物的存储量小于cap_i,则会立即制作该食物,
直到达到cap_i。其中,不同种类食物可以同时制作,同种类食物只能依次制作。 从07:00:00到22:00:00(含),
学生可以在系统中点餐(如果系统未关闭)。每一天按照顺序有n个订单,第i个订单发生在时间a_i:b_i:c_i,
其要求一份type_i类型(type_i∈M_combo∪N_food,其中M_combo和N_food分别表示全体的套餐和食物的集合)的套餐或食物。
如果点餐时系统关闭,会导致点餐失败。22:00以后如果还有之前的订单未完成,则麦当劳会继续加班,且保证23:59:59(含)前一定能完成所有订单。
对于订单处理存在如下规则: 在每一秒的开始,如果有新的食物完成,则首先存储食物,然后接受订单(如果存在)。 订单按照“先来先到,异步处理”原则进行处理。
先来先到:指的是对于有存量的食物,总会被分配给时间最早的订单(套餐或单点)。
异步处理:指的是当一个订单(套餐或单点)因为请求的食物没有被全部满足时,不必等待该订单完成,可以直接处理下一个订单。
食物一旦被分配给订单,就不能撤销。
食物被分配给订单后,即便该订单尚未完成,该食物也不再占用对应类型的容量。
当订单(套餐或单点)中要求的所有食物,均已被分配给该订单,则该订单会立刻完成。
如果在某个时刻t_0,有人下了一个订单,并且该订单无法立刻完成,导致未完成订单的数量大于W_1,则系统立即自动关闭(不再接受订单),但该订单仍然算作成功下单。
如果在某个时刻t_1,未完成订单的数量小于W_2,则系统将在1秒后重新打开。即系统可以接受t_1+1时刻的订单,而不能接受t_1时刻的订单。
你的系统需要输出:每一个订单是否下单成功,以及完成的时间。
菜单文件 本题为大家提供麦当劳的菜单文件(dict.dic),按如下格式给出:
第一行给出N和M,其中N表示食物的种类数(1≤N≤100),M表示套餐的种类数(1≤M≤100)。
第二行包含N个字符串,每个字符串 name_i^food表示第i种食物的名称(不超过50个字符)。
第三行包含N个整数t_1,t_2,...,t_N(1≤t_i≤70),其中t_i表示第i种食物的制作时长。
第四行包含N个整数cap_1,cap_2,...,cap_N(1≤cap_i≤n),其中cap_i表示第i种食物的最大存储容量。
第五行包含两个整数W_1,W_2(2≤W_2≤W_1≤100)。
接下来M行,其中的第i行包含多个字符串,第一个字符串name_i^combo表示第i个套餐的名称(不超过50个字符),
后续的第j个字符串name_(i,j)^food表示第i个套餐中包含的第j种食物的名称。
一个套餐包含的食物种类不超过5,每种食物只有1个。
注:系统每次运行时所读取的菜单文件内容可能不一样。
输入 第一行包含一个整数n(1≤n≤54001)表示订单个数。
对于接下来的n行,用格式类似于11:11:11的方式,给出第i个订单的时间。
然后输入一个字符串type_i,表示套餐或食物的名称(参见dict.dic)。
所有订单时间一定在[07:00:00,22:00:00]内,同一个时间点不可能出现多个订单,第i-1个订单一定早于第i个(2≤i≤n),且保证23:59:59(含)前一定能完成所有订单。
具体参见input.txt
输出 输出包括n行,按照订单顺序输出订单完成时间。
对于第i行,如果第i个订单不成功,则输出Fail;否则,输出这个订单完成的时间,时间格式与输入格式(11:11:11)一致。
//经典的现实模拟应用。
QQ:523857886
//代码阅读:
... ...