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

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

蓝桥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;
}
1 回复 0 转发 0 喜欢 12 阅读
回复 (1)
默认 最新
露米 5 天前
谢谢分享这么清晰的思路,看到全通过的记录真的很替你开心。

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

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

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

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