概述
一、优先队列基本语法
1.定义
#include<queue>
#include<functional>
#include<vector>
//大顶堆
priority_queue<int> maxheap;
//小顶堆
priority_queue<int, vector<int>, greater<int>> minheap;
2.函数
maxheap.empty();
int t=maxheap.top();
maxheap.pop();
maxheap.push(5);
maxheap.size();
二、POJ两题
1、Huffman编码树
http://algorithm.openjudge.cn/2020hw1/2D/
题目:计算最小树外部路径长度总和。
思路:使用优先队列,每次弹出两个最小的数a b,ans+=a+b,再把(a+b)入队,直到队空。
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
priority_queue<int> maxheap;
priority_queue<int, vector<int>, greater<int>> minheap;
int main(){
int t, n; cin >> t;
while (t--){
int ans = 0;
while (!minheap.empty())
minheap.pop();
cin >> n;
for (int i = 0; i < n; i++){
int temp; cin >> temp;
minheap.push(temp);
}
while (!minheap.empty()){
int a = minheap.top(); minheap.pop();
if (minheap.empty()) break;
int b = minheap.top(); minheap.pop();
ans += (a + b);
minheap.push(a + b);
}
cout << ans << endl;
}
return 0;
}
2、Dynamic Median(模拟堆)
http://algorithm.openjudge.cn/2020prefinaltest/C/
- 题目:找数列中的中位数。
- 思路:使用优先队列,模拟两个堆(e.g. 大顶堆:1,2,|小顶堆:3,4),保证左边的大顶堆元素个数永远比小顶堆多1或等于。则大顶堆的堆顶元素为中位数。
- 注:读入字符时%c前加一个空格防止读入空格,否则一直不能ac…scanf(" %c", &c);
插入数字前判断堆是否为空。
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
priority_queue<int> maxheap;
priority_queue<int, vector<int>, greater<int>> minheap;
void query(){
printf("%dn", maxheap.top());
}
void del(){
maxheap.pop();
if (maxheap.size() < minheap.size()){
int temp = minheap.top();
minheap.pop();
maxheap.push(temp);
}
}
void insert(){
int temp; scanf("%d", &temp);
if (maxheap.empty() || minheap.empty()){
maxheap.push(temp);
}
else{
if (temp > minheap.top())
minheap.push(temp);
else
maxheap.push(temp);
}
if (maxheap.size() == minheap.size() + 2){
temp = maxheap.top();
maxheap.pop();
minheap.push(temp);
}
if (maxheap.size() < minheap.size()){
int temp = minheap.top();
minheap.pop();
maxheap.push(temp);
}
}
int main(){
int t, n;
scanf("%d", &t);
while (t--){
while (!minheap.empty())
minheap.pop();
while (!maxheap.empty())
maxheap.pop();
scanf("%d", &n);
while (n--){
char c;
scanf(" %c", &c);
if (c == 'I') insert();
else if (c == 'Q') query();
else del();
}
}
return 0;
}
最后
以上就是轻松未来为你收集整理的【POJ】优先队列的应用一、优先队列基本语法二、POJ两题的全部内容,希望文章能够帮你解决【POJ】优先队列的应用一、优先队列基本语法二、POJ两题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复