【AcWing】学了一坤时才明白的一道题

简介: 外卖店优先级 - AcWing题库

这道题小吉花了一坤时才弄明白,虽然花的时间有点长

但是至少是明白了

😎😎😎😎😎😎


1241. 外卖店优先级 - AcWing题库

12.1.png

这道题如果纯纯用暴力,也不是不能做,毕竟是蓝桥杯的题,还是可以拿到分的,但是拿不全


下面就是优化版本


⭐⭐⭐


注意用sort为pair排序时,先比较  .first,再比较  .second,


变化位置时,  .first  .second 一起变化


具体可以参考下面的代码


⭐⭐⭐


代码的总体思路就是先排序,把 ts 相同的放在一起  

#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
int n, m, T;
int score[N];//优先级
int last[N];//店铺i上一次有订单的时间 
bool st[N];//是否加入到优先缓存中
PII order[N];
int main()
{
    scanf("%d%d%d", &n, &m, &T);
    for (int i = 0; i < m; i ++ ) scanf("%d%d", &order[i].x, &order[i].y);// ts id
    sort(order, order + m);
    for (int i = 0; i < m;)
    {
        int j = i;
        while (j < m && order[j] == order[i]) j ++ ;//代表order[].x order[].y都对应相等
        int t = order[i].x, id = order[i].y, cnt = j - i;
        i = j;
        score[id] -= t - last[id] - 1;//时间差,具体看下面的解释
        if (score[id] < 0) score[id] = 0;
        if (score[id] <= 3) st[id] = false; // 以上处理的是t时刻之前的信息
        score[id] += cnt * 2;
        if (score[id] > 5) st[id] = true;
        last[id] = 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 ++ ) res += st[i];
    printf("%d\n", res);
    return 0;
}

🍔 score[id] - = t - last[id] - 1


t 代表当前时间,last[id]代表 t 前一个的时间,因为要算出整块的时间,这样方便改变优先值


因为已经跳出while循环了,所以这一部分是没有接到订单的,所以是score[] -  


为什么要 -1


比如 t = 5,last[id] = 2,那么就是 3,4两个数(5-2-1)


🍔最后一个订单怎么处理


12.2.png

12.2.png

Code over!

相关文章
|
6月前
|
C语言
c语言编程练习题: 7-1 重要的话说三遍
这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行,除了每行的回车不能有任何多余字符。 代码长度限制16 KB时间限制400 ms内存限制64 MB
128 0
|
人工智能 算法 机器人
迷宫问题(C语言实现)(牛客网百度笔试真题)
迷宫问题(C语言实现)(牛客网百度笔试真题)
229 0
|
存储 JavaScript 前端开发
牛客刷题DAY3(编程题)
牛客刷题DAY3(编程题)
86 0
leetcode14(弄懂了一个知识点)
这个题有一点细节,所以就记录一下(可能不一定准确)
77 0
|
C语言
【leetcode】学了栈和队列却觉得无用武之地?试试这几道题目吧!
【leetcode】学了栈和队列却觉得无用武之地?试试这几道题目吧!
88 0
|
存储 分布式计算 Java
几道面试题
几道面试题
几道面试题
|
编译器 测试技术 C++
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)(上)
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)(上)
|
算法
我明白了,leetcode91题
91题**解码方法**的难度属于中等,但其涉及到的知识并不少呢,斐波那契、备忘录剪枝、动态规划等等,除了题解之外,我也会深入浅出的讲解这些知识点,文章末尾我还会使用 正则 + 斐波那契的写法来解题,我们一起来看看。
141 0
我明白了,leetcode91题