基础数据结构(6)优先队列

本文介绍了优先队列的基本概念及使用方法,并通过多个实例详细展示了优先队列在任务系统和寻找最小和等问题中的具体应用。

从零起步看算法(第二十一  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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值