蓝桥杯:外卖优先级(C++)

原题:

“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。 每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

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

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

【输入格式】

第一行包含 3 个整数 N、M 和 T。 以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到 一个订单。

【输出格式】

输出一个整数代表答案。

【样例输入】

2 6 6

1 1

5 2

3 1

6 2

2 1

6 2

【样例输出】

1

【样例解释】

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

【评测用例规模与约定】

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

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

解题思路:

先为每个时刻建立一个时刻表,时刻表中保存着该时刻有订单的商家

然后模拟每个时刻,建立缓存表

在每个时刻时,先遍历缓存表,如果缓存表里的商家出现在时刻表中,在时刻表中清除该商家,并在缓存中让该商家的优先级+2,如果不存在则在缓存中优先级-1,优先级为0时移出缓存表(为了提高下次遍历缓存表的效率)

再遍历一遍时刻表,把时刻表中剩余的商家添加进缓存表中

…(重复以上步骤)

最后统计缓存表中优先级大于5的商家个数

这里用到了vector、map

vector动态数组,map相当于Python里的字典

代码也用了C11标准

代码实现:

#include<iostream>
#include<vector>
#include<map>

using namespace std;

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

    vector<vector<int>> ve1(t + 1);

    for (int i = 1; i <= t; ++i)
    {
        int a, b;
        cin >> a >> b;
        ve1.at(a).push_back(b);
    }


    map<int, int> ma1;				  // 缓存
    for (int f = 1; f <= t; ++f)      // 遍历时刻总表
    {
        for (auto &a : ma1)     	  // 遍历缓存
        {
            for (auto &b : ve1.at(f)) // 遍历时刻子表f下的所有订单
            {
                if (a.first == b)     // 判断缓存中的商家是否出现在时刻子表f中
                {
                    b = 0;            // 删掉时刻子表f中的该订单
                    a.second += 2;    // 缓存中的商家在时刻子表f中,其优先级+2
                }
                else
                {
                    a.second -= 1;    // 缓存中的商家不在时刻子表f中,其优先级-1
                    if (a.second == 0)
                        ma1.erase(a.first);     // 如果其优先级降为0,则在缓存中删除
                }
            }
        }

        for (auto &a : ve1.at(f))    // 遍历时刻子表f下剩余的订单
        {
            if (a != 0) 			 // 如果还存在没有导入缓存的订单,将其加入缓存
                ma1.insert(pair<int, int>(a, 2));
        }

    }

    int cot = 0;
    for (auto &i : ma1)     // 遍历缓存,统计其中优先级大于5的商家
        if (i.second > 5)
            ++cot;
    cout << cot;

    return 0;
}

运行结果:

测试输入:

2 6 6
1 1
5 2 
3 1 
6 2 
2 1 
6 2 

运行结果:

1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值