[蓝桥杯][2019年第十届真题]外卖店优先级(优先队列和map的使用)题解

题目描述

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

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

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

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

输入

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

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

输出

输出一个整数代表答案。

样例输入

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

样例输出

1

思路

1、用优先队列数组记录每一时刻的所有订单。即时刻i的所有订单存储在moment[i]队列里(由于优先队列的特性,订单种类已排好序(不能用普通队列),而且可以重复(不能用set))

2、用map记录每一时刻处在优先缓存的外卖店。

3、用store数组记录每一家外卖店的优先级。

4、比较巧妙地一点:pri变量地设立。用来实现题中(每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;)这句话。每过一个时间点,pri++。相当于不减小1,但把0每增加1。(增加下限)

基于以上四点对题目进行模拟,即可求出答案(为map的size)。

AC代码

#include<queue>
#include<map>
#include<functional>
#include<vector>
#include<iostream>
#include<stdio.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > moment[100001];
int store[100001]={0};
int main()
{
	int n,m,t,ts,id;
	cin>>n>>m>>t;
	for(int i=0;i<m;i++)
	{
		cin>>ts>>id;
		moment[ts].push(id);
	}
	int pri=0;
	map<int,int> a;
	for(int i=1;i<=t;i++)
	{
		pri++;
		int pre,cou;
		while(!moment[i].empty())
		{
			pre=moment[i].top();cou=0;
			while(!moment[i].empty()&&pre==moment[i].top())
			{
				cou++;
				moment[i].pop();
			}
			store[pre]=store[pre]<pri?pri+2*cou:store[pre]+2*cou+1;
			
			if(store[pre]-pri>5)
			{
				a[pre]=store[pre];
			}
		}
		for(map<int,int>::iterator it=a.begin();it!=a.end();)
		{
			if(it->second-pri<=3) a.erase(it++);
			else it++;
		}
	}
	cout<<a.size()<<endl;
	return 0;
}

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
蓝桥杯一个国内著名的计算机比赛,为了帮助参赛者更好地准备和了解比赛的题型,组委会会公布历真题并提供相应的题解。 首先,我们需要了解蓝桥杯一个综合性的计算机比赛,测试的对象包括计算机基础知识、编程能力以及解决实际问题的能力。 在历真题,参赛者将面临不同类型的题目,包括算法设计与优化问题、数据结构算法问题、编程题等。其针对Python B组的题目主要考察的是对Python语言的掌握和应用能力。 题目解答一般会包含以下几个方面的内容: 1. 题目分析与理解:读取题目,理解题目的要求和限制条件。通过仔细分析题目,确定题目的输入与输出,以及问题的核心。 2. 设计解决方案:根据题目要求和限制条件,设计一个合适的解决方案。可以使用合适的算法数据结构来解决问题,并做出相应的性能优化。 3. 编写代码实现:根据设计的方案编写相应的代码实现。需要注意的是,Python语言有其独特的语法和特性,掌握好这些特性可以更好地完成编程任务。 4. 调试与测试:编写完代码后,需要进行调试和测试。通过运行样例输入和输出,检查代码是否符合题目要求,并且没有逻辑上的错误。 5. 总结与优化:在完成题目解答后,可以进行总结和优化。包括分析算法复杂度、代码风格和可读性等方面,以便在比赛更好地表现。 在准备蓝桥杯时,可以通过阅读历真题题解来了解比赛的难度和类型,针对性地进行练习和提高。同时也可以参加相关的培训班和讨论活动,与其他参赛者交流经验和技巧。 总而言之,历蓝桥杯真题的解答对于提高自己的编程能力和应对比赛非常有帮助。通过认真分析和实践,可以更好地理解并掌握Python编程,并在比赛取得更好的成绩。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值