P8685 [蓝桥杯 2019 省 A] 外卖店优先级

题目描述

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

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

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

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

输入格式

第一行包含 3 个整数 N 、 M 和 T。

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

一个订单。

输出格式

输出一个整数代表答案。

输入输出样例

输入 #1

复制代码
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

输出 #1

复制代码
1

说明/提示

样例解释

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 66,

加入优先缓存。所以是有 1 家店 (2 号)在优先缓存中。

评测用例规模与约定

对于80% 的评测用例,1≤N,M,T≤10000。

对于所有评测用例,1≤N,M,T≤105,1≤ts≤T,1≤id≤N。

首先,对于每一家店,我们考虑到需要从时间 1 开始,一直遍历到时间 T,如果有记录,那么 优先级 加上 2,否则,优先级 减去 1,对于每一个节点,判断这家店 是否在优先推荐中 ,那么此时,由于我们把有记录和没有记录的时间点都遍历了一遍,自然浪费时间,所以,我们可以只 查找这家店有记录的时间点,没有用的点,我们用减法就能求出

值得注意的点是,优先级的加减应该放的位置。由于我们是对没有记录的点使用了减法,代表他在这个时间点之前每一个时间点都减了一。所以在这期间他就有可能被移出优先缓存中,所以在我们减完之后立马就要判断它是否被移除了优先缓存。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

pair<int,int> a[100005];
int Time[100005] = { 0 };//表示某一个店上一次收到外卖订单的时间点
int cnt[100005] = { 0 };//积分
bool is_priority[100005] = { false };

signed main()
{
    int n, m, t;cin >> n >> m >> t;
    for (int i = 0;i < m;i++)
    {
        cin >> a[i].first >> a[i].second;//时间与id
    }
    sort(a, a + m);
    for (int i = 0;i < m;i++)
    {
        int id = a[i].second, ts = a[i].first;
        if (Time[id] != ts)
            cnt[id] -= ts - Time[id] - 1;
        Time[id] = ts;
        if (cnt[id] < 0)
            cnt[id] = 0;
        if (cnt[id] <= 3 && is_priority[id])
            is_priority[id] = false;
        cnt[id] += 2;
        if (cnt[id] > 5)
            is_priority[id] = true;
    }
    for (int i = 1;i <= n;i++)//结束时还要再结算一次点数
    {
        cnt[i] -= t - Time[i];
        if (cnt[i] < 0)
            cnt[i] = 0;
        if (cnt[i] <= 3 && is_priority[i])
            is_priority[i] = false;
    }

    int ans = 0;
    for (int i = 1;i <= n;i++)
    {
        if (is_priority[i])
            ans++;
    }
    cout << ans;

    return 0;
}
相关推荐
CSDN_Colinw几秒前
C++模块化设计原则
开发语言·c++·算法
草原上唱山歌2 分钟前
如何理解C语言中的指针?
c语言·开发语言·数据结构
MicroTech20253 分钟前
微算法科技(NASDAQ: MLGO)使用机器学习保障量子安全下区块链高效可用
科技·算法·机器学习
m0_662577973 分钟前
C++中的模板方法模式
开发语言·c++·算法
We་ct5 分钟前
LeetCode 33. 搜索旋转排序数组:O(log n)二分查找
前端·算法·leetcode·typescript·个人开发·二分·数组
智驱力人工智能7 分钟前
一盔一带AI抓拍系统能否破解非机动车执法取证难 骑行未戴头盔检测 电动车未戴头盔智能监测 摩托车头盔佩戴AI识别系统 边缘计算实时处理
人工智能·算法·yolo·目标检测·边缘计算
重生之我是Java开发战士10 分钟前
【优选算法】优先级队列:最后一块石头的重量,数据流中的第K大元素,前K个高频单词,数据流中的中位数
数据结构·算法·leetcode
智算菩萨13 分钟前
音频处理基础理论:从物理声波到数字信号完整知识体系
算法·机器学习·电脑·音视频
小高求学之路1 小时前
计算机视觉、YOLO算法模型训练、无人机监测人员密集自动识别
算法·yolo·计算机视觉
散峰而望1 小时前
【基础算法】剪枝与记忆化搜索:算法优化的双刃剑,效率倍增的实战指南
算法·机器学习·剪枝