c++ priority_queue题解(爱思创)

本文通过一个实例介绍了如何使用优先队列(大根堆)解决数据处理中的特定问题。文章详细解释了优先队列的概念,包括其基本操作,并提供了C++代码实现。在给定的输入序列中,当遇到与前面剩余元素最小值相等的数时,优先队列能够高效地消除这两个元素并输出新的最小值。通过这个例子,读者可以更好地理解优先队列在算法中的应用。
摘要由CSDN通过智能技术生成

前言:

这篇文章是为了帮助一些

像我这样的菜鸟

找到简单的题解

之前说了数据结构队列

本期我们来看一下优先队列

问题描述:

题目描述

依次读入 n 个整数 ai​ ,其中可能存在相同的元素。

对于每次读入的元素 ai​,如果它与前面剩余元素中的最小值相同时,则同时消除这 2 个元素,并输出此次消除操作之后剩余元素的最小值。如果该元素没有发生“消除”操作,则输出 None

特别地,在 “输出剩余元素的最小值” 时,如果没有剩余元素,则输出 -1 。

输入格式

第一行:n (1≤n≤105) 。

第二行:n 个用空格隔开的整数 ai​ (−109≤ai​≤109) 。

输出格式

输出共 n 行,每行一个操作结果。

样例输入

5
3 1 1 3 3

样例输出

None
None
3
-1
None

问题解析:

本题之需要了解优先队列

然后就非常简单了

优先队列的简介:

优先队列也是一种抽象数据类型。

优先队列中的每个元素都有优先级

而优先级高(或者低)的将会先出队,

而优先级相同的则按照其在优先队列中的顺序依次出队。

优先队列的函数:

优先队列函数
q.size();返回q里元素个数
q.empty();返回q是否为空,空则返回1,否则返回0
q.push(k);在q的末尾插入k
q.pop();删掉q的第一个元素
q.top();返回q的第一个元素

priority_queue队列:相关资料


重点:

优先队列定义

分大根堆和小根堆

priority_queue <int> q;
//也可以是是一个结构体
priority_queue <int,vector<int>,greater<int> > q;//从小到大
//不需要#include<vector>头文件
priority_queue <int,vector<int>,less<int> >q;//从大到小
//默认从大到小

题目代码:

先写完变量如题目

需优先队列

priority_queue<int, vector<int>,greater<int> > q;//从小到大
int n,a,i,x;//如题目

直接进入主函数

int main()
{
	cin>>n;
	while(n--)//这样写简单
	{
		cin>>x;//输入
		if(!q.empty() && x==q.top())//如果出现了一次
		{
			q.pop();//删掉两个数
			if(q.empty()) cout<<-1<<endl;//判断没有剩下的数
			else cout<<q.top()<<endl;//有剩下的数则输出
		}
		else//没出现过
		{
			q.push(x);//入队
			cout<<"None"<<endl;//没有变化
		}
	}
	return 0;
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>,greater<int> > q;//从小到大
int n,a,i,x;//如题目
int main()
{
	cin>>n;
	while(n--)//这样写简单
	{
		cin>>x;//输入
		if(!q.empty() && x==q.top())//如果出现了一次
		{
			q.pop();//删掉两个数
			if(q.empty()) cout<<-1<<endl;//判断没有剩下的数
			else cout<<q.top()<<endl;//有剩下的数则输出
		}
		else//没出现过
		{
			q.push(x);//入队
			cout<<"None"<<endl;//没有变化
		}
	}
	return 0;
}

题目测评:

 样例通过

成功AC  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值