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

从样例可看出同一外卖店某一时刻可能会有多个订单。

我们先将订单按时间排序,再按外卖店编号排序,这样同一时刻若存在多个订单,外卖店编号相等的一定相邻。

对某一时刻\(T_i\)的订单来说,我们累加该时刻同一外卖店编号的所有订单产生的优先级。

在累加优先级前,先计算出外卖店距离上次产生订单的时刻至\(T\)时刻时间内,由于没有订单所带来的优先级的减少。

之后累加\(T_i\)时刻所有订单带来的的优先级的增加。

最后再对最终的\(T\)时刻特殊处理一下即可。

注意点

并不需要真的将优先级大于\(5\)的外面店加入缓存队列中,只需一个标记数组表明是否在队列中即可。

const int N=1e5+10;
PII a[N];
int level[N];
int last_time[N];
bool vis[N];
int n,m,t;

int main()
{
    cin>>n>>m>>t;

    for(int i=0;i<m;i++)
        cin>>a[i].fi>>a[i].se;
    sort(a,a+m);

    for(int i=0;i<m;)
    {
        int j=i;
        while(j<m && a[j] == a[i]) j++;
        int tim=a[i].fi,id=a[i].se;
        level[id]-=tim-last_time[id]-1;
        level[id]=max(level[id],0);
        if(level[id] <= 3) vis[id]=false;

        level[id]+=(j-i)*2;
        if(level[id] > 5) vis[id]=true;

        last_time[id]=tim;
        i=j;
    }

    for(int i=1;i<=n;i++)
        if(last_time[i] < t)
        {
            level[i]-=t-last_time[i];
            if(level[i] <= 3) vis[i]=false;
        }

    int res=0;
    for(int i=1;i<=n;i++)
        if(vis[i])
            res++;

    cout<<res<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-03-27 22:25  Dazzling!  阅读(163)  评论(0编辑  收藏  举报