蓝桥杯2019初赛外卖店优先级

题目描述

“饱了么”外卖系统中维护着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<=100000,1<=ts<=T,1<=id<=N。

输出

输出一个整数代表答案。

样例输入 Copy

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

样例输出 Copy

1

今天重新来做这道题(其实是堕落了好久又良心发现了)

重新模拟样例的时候发现,不同的外卖店之前好像是互相独立,互不影响的???!!!

那为什么之前要想着用数据结构存储它们呢?对每个外卖店单独模拟不也一样的吗?

于是果断敲代码:

#include
using namespace std;
typedef long long ll;
const int Max = 100010;
vector<int> dingdan[Max];
int p[Max];
bool incache[Max];
int N,M,T;

int main() {
     
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> N >> M >> T;
    int ts,id;
    for(int i = 1; i <= N; ++i)
    {
     
        dingdan[i].clear();
    }
    for(int i = 0; i < M; ++i)
    {
     
        cin >> ts >> id;
        dingdan[id].push_back(ts);
    }
    int ans = 0;
    for(int i = 1; i <= N; ++i)
    {
     
        int sz = dingdan[i].size();
        if(sz == 0)
            continue;
        sort(dingdan[i].begin(),dingdan[i].end());
        int now = dingdan[i][0];
        int pre = now;
        for(int j = 0; j < sz; ++j)
        {
     
            now = dingdan[i][j];
            int cha = now - pre;
            if(cha == 0 || cha == 1)
            {
     
                p[i] += 2;
                if(p[i]>5)
                {
     
                    incache[i] = true;
                }
            }
            else
            {
     
                // 先减再加
                p[i] -= cha-1; 
                if(p[i] < 0)
                    p[i] = 0;
                if(p[i] <= 3)
                {
     
                    incache[i] = false;
                }
                p[i] += 2; 
                if(p[i]>5)
                {
     
                    incache[i] = true;
                }
            }
            pre = now;

        }
        int cha = T - pre;
        if(cha > 0)
        {
     
            p[i] -= cha;
            if(p[i] <= 3)
                incache[i] = false;
        }
        if(incache[i])
            ans ++;
    }
    cout << ans;
    return 0;
}

你可能感兴趣的:(算法)