天天看點

Python|外賣店優先級

問題描述

外賣系統中維護着N家外賣店,編号1~N。每家外賣店都有一個優先級,初始時(0時刻)優先級都為0。

每經過1個時間機關,如果外賣唐沒有訂單,則優先級會減少1,最低減到0;而如果外賣店有訂單,則優先級不減反加,每有一單優先級加2。

如果某家外賣店某時刻優先級大于5,則會被系統加入優先緩存中;如果優先級小于等于3,則會被清除出優先緩存。

給定T時刻以内的M條訂單資訊,請你計算T時刻時有多少外賣店在優先緩存中。

【輸入格式】

第一行包含3個整數N、M和T。

以下M行每行包含兩個整數t和id,表示ts時刻編号id的外賣唐收到一個訂單

【輸出格式】

輸出一個整數代表答案。

【樣例輸入】

2 6 6

1 1

5 2

3 1

6 2

2 1

【樣例輸出】

1

【樣例解釋】

6時刻時,1号店優先級降到3,被移除出優先緩存;2号唐優先級升到6加入優先緩存。是以是有1家店(2号)在優先緩存中。

解決方案

這道題是根據輸入的資料依次判斷時間點是否有訂單來進行優先級的加減。那麼直接根據輸入的資料建立一個初始值為0的清單,再按照輸入資料随着時間進行判斷。

這裡可以創立一個新的清單,利用字典對輸入的值進行填充,再周遊新創立的清單,有就+2,沒有就-1。

最後便是對加入或者删除優先級緩存的判斷。對緩存的判斷要以3為标準。這樣才可以對已加入緩存的店鋪進行加減。最後周遊删除<=3就行。

代碼示例:

N, M, T = map(int, input().split())

lis = [0 for i in range(N)]   #建立一個基礎優先級為0的清單

lis_a, lis_b = [], []

dic = {}

for i in range(M):

    a, b = map(int, input().split())

    lis_a.append(a)

    lis_b.append(b)

for i in range(1, T+1):     #按時間點進行判斷

    lis1 = []               #每次周遊的時間點若有訂單就加入

    for j in range(M):

        if lis_a[j] == i:

            lis1.append(lis_b[j])

    for k in lis1:         #在清單中,即有訂單,+2

        lis[k-1] += 2

    for p in range(1, N+1):  #不在清單,-1

        if p not in lis1 and lis[p-1] > 0:   #最低到0

            lis[p-1] -= 1

    for q in range(N):

        if lis[q] >= 3:   #當優先級>3便加入或者更改

            dic[q+1] = lis[q]

for k in list(dic):   #優先級<=3,便删除

    if int(dic[k]) <= 3:

        dic.pop(k)