从零起步看算法(第二十一 5.13)
//优先队列
1.基本应用
参见讲解:点击打开链接
//基本概念
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<int> q; // 声明一个装 int 类型数据的优先队列
q.push(1); // 入队
q.push(2);
q.push(3);
while (!q.empty()) { // 判断队列是否为空
cout << q.top() << endl; // 访问队列首元素
q.pop(); // 出队
}
return 0;
}
/*
输出为
3
2
1
*/
2.例题理解
给出两个包含 nn个整数的数组 A,B。分别在 A, BB中任意出一个数并且相加,可以得到 n^2个和。求这些和中最小的 n 个
3.队列重载
struct node {
int dist, loc;
node() { }
bool operator < (const node & a) const {
return dist > a.dist;
}
};
priority_queue <node> Q;
4.任务系统
重载的应用和学习
//任务系统
#include<iostream>
#include<queue>
#include<string>
using namespace std;
//定义结构体
struct Node{
int Q,period,period_change;
bool operator < (const Node & rhs) const{
return period_change > rhs.period_change|| (period_change==rhs.period_change&& Q>rhs.Q);
//升序排序
}
};
int main(){
priority_queue<Node> q;
Node node;
int n,k;
cin>>n>>k;
//录入,排序
while(n--){
string s;
int a,b;
cin>>s>>a>>b;
node.Q=a;
node.period=b;
node.period_change=b;
q.push(node);
}
//输出
for(int i=0;i<k;i++){
node=q.top();
q.pop();
cout<<node.Q<<endl;
//计时器
node.period_change+=node.period;
q.push(node);
}
return 0;
}
5.n个最小和
一脸懵逼,需要沉淀。
//n个最小和
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int a[100000+5],b[100000+5],c[100000+5];
int n;
struct data{
int aa,bb,c;
}o[100000+5],z;
//升序
bool operator < (data x,data y){
return x.c>y.c;
}
priority_queue<data > q;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
cin>>b[i];
}
sort(b+1,b+1+n);
//a1+b1<a1+b2<a1+b3<a1+b4<...<a1+bn
for(int i=1;i<=n;i++){
o[i].aa=1;
o[i].bb=i;
o[i].c=a[o[i].aa]+b[o[i].bb];
q.push(o[i]);
}
for(int i=1;i<=n;i++){
if(i!=1)cout<<" ";
z=q.top();
q.pop();
cout<<z.c;
//最左和最右两列
z.aa++;
z.c=a[z.aa]+b[z.bb];
q.push(z);
}
return 0;
}