蓝桥杯day18刷题日记(优先队列模板)

P9421 [蓝桥杯 2023 国 B] 班级活动

思路:题目相当于就是叫我们给数据配对,所以给我们的n一定是一个偶数,其次把id若是相同而且超出2的部分记录下来,然后就开始给此id只有一个人的配对,等把超出2那一部分人用完以后,再把将剩下的人数记录下来两两配对

#include <iostream>
using namespace std;
int n,a,res,ans;
int q[100010];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a;q[a]++;
		if(q[a]>2) res++;
	}
	int m=res;
	for(int i=1;i<=n;i++)
	{
		if(m>0&&q[i]==1) m--;
		else if(m==0&&q[i]==1) ans++;
	}
	if(res>0) cout<<res+ans/2;
	else cout<<ans;
	return 0;
}

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

思路:考查优先队列,用优先队列记录一家外卖店订单的先后顺序,然后遍历记录在推荐序列的时刻,最后在和题目给的时刻比较

#include <queue>
#include <vector>
priority_queue<int,vector<int>,greater<int>> h[100010];升序
priority_queue<int,vector<int>,less<int>> h[100010];降序
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int,vector<int>,greater<int>> h[100010]; 
int n,m,t;
int ts,id;
int lastget;//上一次拿到外卖的时间 
int x;//这一次拿到外卖的时间 
int prilevel;//优先级 
bool in;//是否在推荐队列里 
int res;//记录指定时刻推荐队列的数量 

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>t;
	for(int i=0;i<m;i++)
	{
		cin>>ts>>id;
		h[id].push(ts);
	}
	
	for(int j=1;j<=n;j++)
	{
		lastget=0;
		prilevel=0;
		in=false; 
		while(h[j].size())
		{
			x=h[j].top();
			h[j].pop();出队
			if(lastget!=x) prilevel-=(x-lastget-1);
			prilevel=(prilevel<0?0:prilevel);
			if(in&&prilevel<=3) in=false;
			prilevel+=2;
			if(prilevel>5) in=true;
			lastget=x;
		} 
		if(lastget!=t) prilevel-=(t-lastget);
		if(prilevel<=3&&in) in=false;
		if(in) res++; 
	}
	cout<<res;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值