题目描述
"饱了么"外卖系统中维护着 NN 家外卖店,编号 1 ∼ NN。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 TT 时刻以内的 MM 条订单信息,请你计算 TT 时刻时有多少外卖店在优 先缓存中?
输入描述
第一行包含 3 个整数 N,M,T
以下 M 行每行包含两个整数 ts,id表示 ts 时刻编号 id 的外卖店收到一个订单。
其中,1≤N,M,T≤105,1≤ts≤T,1≤id≤N。
输出描述
输出一个整数代表答案。
输入输出样例
示例
输入
1. 2 6 6 2. 1 1 3. 5 2 4. 3 1 5. 6 2 6. 2 1 7. 6 2
输出
1
样例解释:
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
运行限制
- 最大运行时间:2s
- 最大运行内存: 256M
思路:
先进行输入,用二维列表存储输入的ts,td。对二维数组根据时间进行排序。创建三个数组,order=[],prior=[],flag=[],分别存储第id号上一回订单的时间,id的优先级,该id是不是在缓存中。初始化为0。然后进行迭代,具体过程写在注释里。
1. first = input() 2. n,m,T=[int (i) for i in first.split()] 3. a=[] 4. 5. for i in range(m): 6. a.append([int(i) for i in input().split()]) 7. 8. #对订单的的时间进行排序,目的是算出当前订单与上一回订单之间的间隔 9. #从未计算出这家店没有订单的时候优先级下降数 10. #即:prior[idd] -= tt-order[idd]-1 11. a=sorted(a,key=lambda a:a[0]) 12. 13. order=[]#订单的时刻 14. prior=[]#优先级的分数 15. flag=[]#是否在优先缓存中 16. #初始化为0 17. order=[0 for i in range(n+1)] 18. prior=[0 for i in range(n+1)] 19. flag=[0 for i in range(n+1)] 20. 21. #遍历每一条订单信息 22. for i in range(m): 23. tt=a[i][0] 24. idd=a[i][1] 25. #如果当前订单的时间不等于上次的订单 26. #由题意每过一秒优先级减1,所以优先级减去间隔 27. if tt != order[idd]: 28. prior[idd] -= tt-order[idd]-1 29. if prior[idd]<0: prior[idd]=0#优先级最低为0 30. if prior[idd]<=3: flag[idd]=0 31. prior[idd]+=2 #有订单则优先级加2 32. if prior[idd]>5: flag[idd]=1 33. order[idd]=tt #记录这次订单的时间,下此迭代使用 34. 35. #处理到了T时刻的情况 36. for i in range(1,n+1): 37. #如果最后一个订单不是T时刻的 38. #要减去最后一趟订单时间与t的差的绝对值 39. if order[i] <T: 40. prior[i]-=T-order[i] 41. if prior[i]<=3: flag[i]=0 42. 43. #遍历求在缓存区的商家个数 44. ans=0 45. for i in range(n+1): 46. if( flag[i]>0): 47. ans+=1 48. print(ans)