【洛谷 P8685】[蓝桥杯 2019 省 A] 外卖店优先级 题解(模拟+优先队列+位集合)

蓝桥杯 2019 省 A 外卖店优先级

题目描述

"饱了么"外卖系统中维护着 N N N 家外卖店,编号 1 1 1 ∼ N N N。每家外卖店都有一个优先级,初始时 ( 0 (0 (0 时刻)优先级都为 0 0 0。

每经过 1 1 1 个时间单位,如果外卖店没有订单,则优先级会减少 1 1 1,最低减到 0 0 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2 2 2。

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

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

输入格式

第一行包含 3 3 3 个整数 N N N 、 M M M 和 T T T。

以下 M M M 行每行包含两个整数 t s ts ts 和 i d id id,表示 t s ts ts 时刻编号 i d id id 的外卖店收到。

一个订单。

输出格式

输出一个整数代表答案。

样例 #1

样例输入 #1

复制代码
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

样例输出 #1

复制代码
1

提示

样例解释

6 6 6 时刻时, 1 1 1 号店优先级降到 3 3 3,被移除出优先缓存; 2 2 2 号店优先级升到 6 6 6,

加入优先缓存。所以是有 1 1 1 家店 ( 2 (2 (2 号)在优先缓存中。

评测用例规模与约定

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

对于所有评测用例, 1 ≤ N , M , T ≤ 1 0 5 1 \le N,M,T \le 10^5 1≤N,M,T≤105, 1 ≤ t s ≤ T 1 \le ts \le T 1≤ts≤T, 1 ≤ i d ≤ N 1 \le id \le N 1≤id≤N。

蓝桥杯 2019 年省赛 A 组 G 题。


思路

首先,定义一个结构体Sorder,包含两个成员变量:ts和id,分别表示订单的时间和外卖店的编号。然后,定义了一个比较函数,用于优先队列的排序,时间靠前的优先。

初始化一些变量,包括n(外卖店的数量)、m(订单的数量)、t(时间单位的数量)、p(用于存储每个外卖店的优先级)、pri(用于标记哪些外卖店在优先缓存中)、vis(用于标记哪些外卖店在当前时间单位有订单)等。

然后,从输入中读取了m条订单信息,将每个订单的时间和外卖店编号加入到优先队列pq1中。

接着,对每一个时间单位,都会执行以下操作:首先,重置vis数组,然后,检查优先队列pq1的顶部元素,如果订单的时间等于当前时间,那么就将该订单的外卖店编号对应的优先级加2,并标记该外卖店在当前时间单位有订单,然后将该订单从优先队列中移除。如果外卖店的优先级大于5,那么就将该外卖店加入到优先缓存中。然后,对所有的外卖店,如果没有订单,那么就将其优先级减1,如果优先级小于等于3并且在优先缓存中,那么就将其从优先缓存中移除。

最后,统计并输出在优先缓存中的外卖店的数量。


AC代码

cpp 复制代码
#include <algorithm>
#include <bitset>
#include <cstring>
#include <iostream>
#include <queue>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

struct Sorder {
	int ts, id;
	struct cmp {
		bool operator()(const Sorder &a, const Sorder &b) {
			// 时间靠前的优先
			return a.ts > b.ts;
		}
	};
};

int n, m, t;
int p[N];
bitset<N> pri, vis;
priority_queue<Sorder, vector<Sorder>, Sorder::cmp> pq1;

void dec() {
	for (int i = 1; i <= n; i++) {
		if (p[i] && !vis[i]) {
			p[i]--;
			if(pri[i] && p[i] <= 3) {
				// 移出优先缓存
				pri[i] = 0;
			}
		}
	}
}

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

	memset(p, 0, sizeof(p));
	cin >> n >> m >> t;
	for (int i = 1; i <= m; i++) {
		int ts, id;
		cin >> ts >> id;
		pq1.push({ts, id});
	}

	pri.reset();
	for (int i = 1; i <= t; i++) {
		vis.reset();
		while (pq1.size()) {
			auto f = pq1.top();
			if (f.ts == i) {
				// cout << i << " " << f.id << endl;
				p[f.id] += 2;
				vis[f.id] = 1;
				pq1.pop();
				if (p[f.id] > 5) {
					// 加入优先缓存
					pri[f.id] = 1;
				}
			} else {
				break;
			}
		}
		dec();
	}

	ll ans = 0;
	for (int i = 1; i <= n; i++) {
		if (pri[i]) {
			ans++;
		}
		// cout << p[i] << " " << pri[i] << endl;
	}
	cout << ans << "\n";
	return 0;
}
相关推荐
wuyk55514 小时前
《WiFi 嵌入式物联网开发全套实战》 | 第 45 章【终章】WiFi 开发全套知识复盘 + 面试高频题 + 进阶路线
物联网·面试·职场和发展
凯瑟琳.奥古斯特17 小时前
OCR文字检测算法对比解析
开发语言·python·职场和发展
背景调查知识库18 小时前
职业背景调查中的职业事实与主观评价分离如何判断?
职场和发展
学顶教育1 天前
学顶教育:公务员面试常见问题!
面试·职场和发展
人才风控观察周刊2 天前
教育机构人员背调方案的方案能力证据、版本与复审周期是否透明可
职场和发展
青少儿编程课堂2 天前
2026蓝桥杯青少组:校园飞鸟穿越赛解析
蓝桥杯·scratch·少儿编程·图形化编程·蓝桥杯青少组
重生之小比特2 天前
【算法拾光】二分查找|二分查找 + 再排序数组中查找元素的第一个和最后一个位置
算法·leetcode·职场和发展
招聘背调实务专家杨宏2 天前
上级评价出现主观偏差与口径冲突时如何校准
职场和发展
职豚求职小程序3 天前
中国铁塔2027届校招开启,网申怎么投、笔试面试怎么准备?
面试·职场和发展
冲冲那年3 天前
项目整合管理
职场和发展