外卖店优先级/模拟(集大成!!!)

外卖店优先级/模拟(集大成!!!)_第1张图片

 题解:

不要看SB示例,越看越迷糊,简而言之,照猫画虎,疯狂循环暴力模拟就OK了

看似容易,实则very困难,难点主要在这几个方面:

1.变量太多,不知道怎么表示,如每个外卖店接收到订单的时间、每个外卖店的优先级、还有是否为优先队列

2.涉及到同一个时间可能好几家店都接受订单,怎么去同时模拟出所有店家的优先级变化情况?再套一个for循环?(×)

那么针对以上两个难点,分别解析:

1.针对难点一,无非就是不知道怎么用一个数组来表示这么多变量,那我们可以用空间换时间,每个变量都用一个数组表示嘛,类似记忆化搜索和动态规划的思路,我们设立三个数组times[i]、prior[i]、flag[i]分别收集第i家外卖店接受订单的时间、优先级和是否为优先队列,只是数值是不断变化的,就像动态规划一样,那么times[i]就表示第i家外卖店上一次接受订单的时间

2.针对这个问题,我们完全可以以静制动,谁说优先级非要动态变化的?我们可以让优先级加的动态地加,减就一次性减嘛,那么这就涉及到times[i]与当前时间ts的差值了,而且在加减的过程中还要注意一些问题

1.什么时候加入优先队列?prior[i]>5,此时flag[i]=1

2.优先级最低降低到0意味着什么?如果prior[i]<0了,你得让prior[i]=0

3.什么时候优先剔除?prior[i]<=3,此时flag[i]=0

4.别忘了要保留接受订单的时间ts:times[id]=ts

5.最后一条订单一定是T时刻吗?当然不是!!所以要在T时刻对每一个外卖店处理一下子,优先级改减的减,该被剔除的就剔除

搞清楚这些,直接AC吧

## 解题思路

请填写解题思路

```
import os
import sys

# 请在此输入您的代码
n,m,t=map(int,input().split())
nums=[list(map(int,input().split())) for i in range(m)]
times=[0]*(n+1)
prior=[0]*(n+1)
flag=[0]*(n+1)
nums.sort(key=lambda x:x[0])
for i in range(m):
  ts,id=nums[i][0],nums[i][1]
  if ts!=times[id]:
    prior[id]-=ts-times[id]
    prior[id]+=1
  if prior[id]<0:prior[id]=0
  if prior[id]<=3:flag[id]=0
  prior[id]+=2
  if prior[id]>5:flag[id]=1
  times[id]=ts 
for i in range(1,n+1):
  if times[i]!=t:
    prior[i]-=t-times[i]
    if prior[i]<=3:flag[i]=0
print(sum(flag))
```

你可能感兴趣的:(蓝桥杯真题,算法)