首先说一下优先队列的概念
在<queue>头文件中,还定义了另一个非常有用的模版类priority_queue(优先队列)。优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权出队列(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。
priority_queue的基本操作与queue的略微不同。
priority_queue的基本操作:
q.empty() // 如果队列为空,则返回true,否则返回false
q.size() // 返回队列中元素的个数
q.pop() // 删除队首元素,但不返回其值
q.top() // 返回具有最高优先级的元素值,但不删除该元素
q.push(item) // 在基于优先级的适当位置插入新元素
在优先队列中默认是从大到小排序。通过top取值
下面说一道牛客网的题目
Wannafly挑战赛15----A题
链接:https://www.nowcoder.com/acm/contest/112/A
来源:牛客网
现有n组人,m个地点,给出每组人的人数,每个地点可容纳的最大人数和选择的价格
要求一种方式,使得每组人都到一个各不相同的地点,最小化选择的价格
每个队伍的人都要在同一个地方每个地方只能有一个队伍
输入描述:
第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
输出描述:
输出最小化选择的价格,无解输出-1
示例1
输入
3 4
2 3 4
1 2
2 3
3 4
4 5
输出
12
备注:
所有数据小于1e5
在这个题中不仅很好的用到了结构体的重载,而且重点用到了优先队列的性质
下面附上代码
#include<iostream>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX=100000+100;
struct Price{
int num,money;
bool operator <(const Price&a){ //结构体重载
return num<a.num;
}
}p[MAX];
int main()
{
priority_queue<int> q;
int n,m;
cin>>n>>m;
int a[MAX];
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
for(int i = 0; i < m; i++)
{
cin>>p[i].num>>p[i].money;
}
sort(a,a+n);
sort(p,p+m);
int sum=0;
for(int i=n-1,j=m-1;i>=0;i--){ //判断大小
while(j>=0&&p[j].num>=a[i])
{
q.push(-p[j].money);
j--;
}
if(q.empty())
{
cout<<"-1"<<endl;
return 0;
}
sum-=q.top();
q.pop();
}
cout<<sum<<endl;
}