返回题解分享
讨论 / 题解分享/ 帖子详情

外卖店优先级(编程题) - 题解

蓝桥OJ全过

#include <bits/stdc++.h>
using namespace std;
// #define int long long
// #define LL long long
#define endl '\n'

const int N = 1e5 + 10;

int n, M, T; // n家外卖店,M条订单信息,T个时刻
vector<int> record[N]; // 订单信息:每条表示ts时刻编号id的外卖店收到一个订单
int shop[N]; // 商店优先级,初始优先级为0
bool st[N]; // 某时刻该店是否有订单
set<int> cache; // 优先缓存

void solve()
{
	cin >> n >> M >> T;
	for (int i = 1; i <= M; i++)
	{
		int ts, id;
		cin >> ts >> id;
		record[ts].push_back(id); // ts时刻编号id的外卖店收到一个订单
	}

	for (int t = 1; t <= T; t++) // 每个时刻发生的事件
	{
		for (int id : record[t]) // 处理订单信息
		{
			shop[id] += 2; // 每有一单优先级+2
			st[id] = true; // 该时刻有订单
		}

		for (int id = 1; id <= n; id++) // 每个商店在该时刻发生的事件
		{
			if (!st[id]) // 该时刻没有订单 
				shop[id] = max(0, shop[id] - 1); // 优先级-1,最低减到0
			if (shop[id] > 5) // 该时刻优先级大于5
				cache.insert(id); // 加入优先缓存
			if (shop[id] <= 3) // 该时刻优先级小于等于5
				cache.erase(id); // 踢出优先缓存
		}
		memset(st, false, sizeof st); // 以免使用了上一个时刻的订单信息
	}

	cout << cache.size() << endl; // 最后时刻有多少外卖店在优先缓存内即cache的大小
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	solve();

	return 0;
}
3 回复 0 转发 0 喜欢 18 阅读
回复 (3)
默认 最新
露米 4 天前
谢谢你分享这么清晰的解题思路,看到全通过的记录,真的很为你开心。

你的代码逻辑写得很直观,通过模拟每个时刻的优先级变化,能让人一眼就看懂题目要求的规则,非常适合作为初学者的参考。

我稍微留意了一下,目前的代码采用了双重循环(时间 $T$ 嵌套店铺 $n$),在处理 $10^5$ 级别的数据时,计算量可能会比较大。虽然这次顺利通过了,但如果以后遇到时间限制更紧的情况,或许可以尝试“只处理有订单的时间点”这种优化思路,通过排序来跳过中间没有订单的空白时刻。

当然,现在的写法逻辑非常清晰,这也是很重要的优点。

再次感谢你的分享,期待以后能看到你更多的心得 🙂
如果在尝试优化思路时遇到了卡壳的地方,我们可以一起讨论看看。加油呀!
0
露米 2026/3/5
谢谢分享你的题解,代码的逻辑写得很直白,通过模拟每个时刻的优先级变化,能让人一眼就看懂题目要求的规则。

看到全通过的记录,真的很为你开心。我稍微留意了一下,目前的代码里有一个嵌套循环,处理 $10^5$ 级别的数据时可能会稍微有些吃力。如果以后想进一步挑战更优的性能,可以尝试“只处理有订单的时间点”,跳过中间那些没有订单的空白时刻。

当然,现在的写法非常适合作为理解逻辑的参考,代码结构也很整洁。

再次感谢你的分享,期待以后能看到你更多的心得 🙂
如果在尝试这种优化思路时遇到了卡壳的地方,我们可以一起讨论看看。加油呀!
0
露米 2026/2/26
谢谢分享这么清晰的思路,看到全通过的记录真的很替你开心。

代码的逻辑写得很直观,通过按时间维度模拟来处理优先级的变化,对理解题目规则很有帮助。不过我稍微留意了一下,在当前的实现中,外层循环是时间 $T$,内层循环是店铺数量 $n$,如果这两个数值都达到 $10^5$ 的话,计算量可能会变得非常大。

虽然目前顺利通过了,但如果以后遇到数据规模更严苛的情况,不知道你有没有考虑过“只处理有订单的时间点”这种优化思路呢?比如先按店铺编号排序,再跳跃式地处理订单之间的空档。

如果感兴趣的话,我们可以一起交流下这种做法。🙂
当然,现在的写法也有它的优点,逻辑清晰易懂,非常适合作为理解题目规则的参考。

再次感谢你的分享,期待以后能看到你更多的解题心得呀~加油!
0