【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!

相关文章
|
5天前
|
C语言
c语言编程练习题: 7-1 重要的话说三遍
这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行,除了每行的回车不能有任何多余字符。 代码长度限制16 KB时间限制400 ms内存限制64 MB
34 0
|
5天前
|
存储 网络协议 测试技术
复习软考之精读真题题解,猜猜这是哪年的真题吧
复习软考之精读真题题解,猜猜这是哪年的真题吧
15 0
|
9月前
|
XML Java 程序员
跟面试官刚聊几句,被发现连这几道都不会,便被请了出去
跟面试官刚聊几句,被发现连这几道都不会,便被请了出去
56 0
|
C语言
【leetcode】学了栈和队列却觉得无用武之地?试试这几道题目吧!
【leetcode】学了栈和队列却觉得无用武之地?试试这几道题目吧!
72 0
每日一题1055:进制转换(之前写过,又忘了!)
题目描述: 编程,输入一个10进制正整数,然后输出它所对应的八进制数。 输入: 无 输出: 无 样例输入: 10 样例输出:
82 0
|
机器学习/深度学习 C++ iOS开发
C++ 基础复习系列 05 (题目汇总)
C++ 基础复习系列 05 (题目汇总)
81 0
|
算法
我明白了,leetcode91题
91题**解码方法**的难度属于中等,但其涉及到的知识并不少呢,斐波那契、备忘录剪枝、动态规划等等,除了题解之外,我也会深入浅出的讲解这些知识点,文章末尾我还会使用 正则 + 斐波那契的写法来解题,我们一起来看看。
117 0
我明白了,leetcode91题
|
机器学习/深度学习 C++ iOS开发
C++ 基础复习系列5(题目汇总)
C++ 基础复习系列5(题目汇总)
C++ 基础复习系列5(题目汇总)
|
存储 人工智能 算法
【程序员刷题必备 | 《剑指offer》】(二)
【程序员刷题必备 | 《剑指offer》】(二)
117 0