[蓝桥杯][2019年第十届真题]外卖店优先级

题目描述

“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。

输入

第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到

一个订单。

输出

输出一个整数代表答案。

样例输入

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

样例输出

1

提示

对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N,M,T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。


#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;

#define MAXN 100001
/*
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
*/

bool cmp(pair<int, int>a, pair<int, int> b) {
    if (a.first == b.first) return a.second < b.second;
    return a.first < b.first;
}

int main()
{
    int n,m,t;
    cin >> n >> m >> t;
    int temp[MAXN], score[MAXN];
    bool cache[MAXN];
    vector < pair<int, int>> F;
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a>>b;
        pair<int, int> p(a, b);
        F.push_back(p);
    }
    sort(F.begin(), F.end(), cmp);
    memset(temp, 0, sizeof(temp));
    memset(score, 0, sizeof(score));
    memset(cache, false, sizeof(cache));
    for (int i = 0; i < m; i++) {
        int ti = F[i].first, si = F[i].second;
        if (ti != temp[si]) score[si] -= ti - temp[si] - 1;
        score[si] = score[si] > 0 ? score[si] : 0;
        if (score[si] <= 3) cache[si] = false;
        score[si] += 2;
        if (score[si] > 5) cache[si] = true;
        temp[si] = ti;
    }
    for (int i = 1; i < n+1; i++) {
        if (t > temp[i]) {
            score[i] -= t - temp[i];
            if (score[i] <= 3) cache[i] = false;
        }
    }
    int res=0;
    for (int i = 1; i < n+1; i++) {
        if(cache[i]==true)res++;
    }
    cout << res;
    return 0;
}

 

posted @ 2020-03-25 02:35  champanesupernova  阅读(721)  评论(0编辑  收藏  举报