原题:
“饱了么”外卖系统中维护着 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