外卖店优先级python(蓝桥杯)

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)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值