1 问题描述
"饱了么"外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中?
输入描述
第一行包含 3 个整数 N,M,T。
以下 M 行每行包含两个整数 ts,id,表示 ts 时刻编号id 的外卖店收到一个订单。
其中,1≤N,M,T≤105,1≤ts≤T,1≤id≤N。
输出描述
输出一个整数代表答案。
输入输出样例
示例
输入
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
输出
1
样例解释:
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
2 问题分析
1.考虑店铺有订单的情况:
2 考虑店铺最后有订单的时间至最后的时间
计算有订单情况的优先级之后,还需判断店铺最后一次有订单到时间与截至时间是否相同,不同,则优先级还需-到截至时间没有订单的时间间隔
例如:1号店铺到时间3就没有订单了,但时间截至为6:
prior[idd]=prior[idd]-(最后的时间-order[idd])
还需判断此时优先级是否降为3: prior[idd]<3,flag[idd]=0
最后统计flag[idd]>0的个数
3 代码求解
first = input()
n,m,T=[int (i) for i in first.split()]
a=[]
for i in range(m):
a.append([int(i) for i in input().split()])
#对订单的的时间进行排序,目的是算出当前订单与上一回订单之间的间隔
#从未计算出这家店没有订单的时候优先级下降数
#即:prior[idd] -= tt-order[idd]-1
a=sorted(a,key=lambda a:a[0])
order=[]#订单的时刻
prior=[]#优先级的分数
flag=[]#是否在优先缓存中
#初始化为0
order=[0 for i in range(n+1)]
prior=[0 for i in range(n+1)]
flag=[0 for i in range(n+1)]
#遍历每一条订单信息
for i in range(m):
tt=a[i][0]
idd=a[i][1]
#如果当前订单的时间不等于上次的订单
#由题意每过一秒优先级减1,所以优先级减去间隔
if tt != order[idd]:
prior[idd] -= tt-order[idd]-1
if prior[idd]<0: prior[idd]=0#优先级最低为0
if prior[idd]<=3: flag[idd]=0
prior[idd]+=2 #有订单则优先级加2
if prior[idd]>5: flag[idd]=1
order[idd]=tt #记录这次订单的时间,下此迭代使用
#处理到了T时刻的情况
for i in range(1,n+1):
#如果最后一个订单不是T时刻的
#要减去最后一趟订单时间与t的差的绝对值
if order[i] <T:
prior[i]-=T-order[i]
if prior[i]<=3: flag[i]=0
#遍历求在缓存区的商家个数
ans=0
for i in range(n+1):
if( flag[i]>0):
ans+=1
print(ans)