外卖店优先级c++

题目

输入样例:

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

输出样例:

复制代码
1

样例解释

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

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

思路

首先说一下暴力做法。我们可以用pair<int, int>来存订单信息,然后按时刻对其进行排序。从前往后遍历一遍订单信息,对于每个时刻,有订单的外卖店优先级加2,无订单的外卖店优先级减1。最后判断哪些外卖店优先级大于5。伪代码如下:

cpp 复制代码
pair<int, int> record[N];//记录外卖信息
int a[N];//a[i]表示第i家外卖店的优先级

sort(record, record + M);

for (i: 0 -> M)
{
    for (i:0 -> M)
    {
        //判断哪些加优先级,哪些减优先级
    }
}

for (i: 0 -> N)//判断哪些优先级大于5

可以看到时间复杂度为O(10^10),可以尝试优化"改变优先级"这部分操作。

我们可以在遍历record数组的过程中使用一个last数组记录一家外卖店上一次接到订单的时间,等到该外卖店的订单再次出现时再处理没有订单期间带来的优先级减少;而不是每一时刻都把没有订单的店铺的优先级减1。如果在同一时刻一家店铺有多个订单,那么就批量处理。

以前的思路是针对一个订单信息的时刻,一个时刻处理所有店铺的优先级,而现在的思路是针对一个订单信息的店铺,一家店铺处理一家店铺的优先级。

代码
cpp 复制代码
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;

PII record[N];
int last[N], score[N];//last[i]表示编号为i的店铺最后一次订单在什么时刻;score[i]表示店铺当前的优先级
bool st[N];//st[i]表示编号为i的店铺是否在缓存中

int main()
{
  int n, m, t;
  
  scanf("%d%d%d", &n, &m, &t);
  
  for (int i = 0; i < m; i ++)
  {
    int ts, id;
    scanf("%d%d", &ts, &id);
    record[i] = {ts, id};
  }
  
  sort(record, record + m);
  
  for (int i = 0; i < m;)
  {
    int ts = record[i].x, id = record[i].y;
    /*
    处理ts时刻之前外卖店铺编号为id减少的优先级
    不可能出现last[id] = ts - 1的情况;因为while循环对于连续时间内同Id的订单已经做了处理
    */
    score[id] -= (ts - last[id] - 1);
    if (score[id] <= 3) st[id] = false;
    if (score[id] < 0) score[id] = 0;
    
    /*
    处理外卖店铺编号为id在ts时刻及以后的连续时刻增加的优先级
    */
    while (id == record[i].y && i <= m)
    {
      score[id] += 2;
      last[id] = record[i].x;
      if (score[id] > 5) st[id] = true;
      i ++;
    }
  }
  
  //处理每家店铺的最后一个订单时刻到T时刻减少的优先级
  for (int i = 1; i <= n; i ++)
  {
    if (last[i] < t)
    {
      score[i] -= (t - last[i]);
      if (score[i] <= 3) st[i] = false;
    }
  }
  
  
  int res = 0;
  for (int i = 1; i <= n; i ++)
  if (st[i])res ++;
  
  printf("%d", res);
  return 0;
}
相关推荐
2401_868534785 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
wabs6666 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing6 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
郝学胜-神的一滴7 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20267 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog7 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
markinmarkin9 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
oyguyteggytrrwwwrt9 小时前
自制交叉线路识别算法
算法
手写码匠9 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
山荷枝10 小时前
Java学习第十天
java·学习