hdu C++模版题目(优先队列)
来源:互联网 发布:博客园 吉祥网络 编辑:程序博客网 时间:2024/06/14 17:33
新入手C++,快被玩弄死了。
STL不熟悉乱用会死人
1. 将变量定义放在每次循环开始,都会自动清零。(以前为了清零,痛苦找不到函数)
2. 容器都可以以数组形式声明多个
3. 优先队列的选优函数可以自己写,运算符重载
<1>概念
优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。优先级队列是堆的一种常见应用。有最大优先级队列(最大堆)和最小优先级队列(最小堆)。优先级队列是一种维护有一组元素构成的集合S的数据结构。
<2>优先队列支持的基本运算
//建立一个保存元素为int的优先级队列,其实是建了一个小顶堆//但是请特别注意这样的建的堆默认是大顶堆,即我们从堆顶去的元素是整个堆中元素最大的。priority_queue<int> Heap;//可以这样建一个表示小顶堆的优先级队列priority_queue<int , vector<int>, greater<int> > Heap;//将元素x放入优先级队列中Heap.push(x);//取出优先级队列第一个元素(堆顶元素),保存在x中int x = Heap.top();//弹出堆顶元素,取出后堆会自动调整为一个最小堆(最大堆)Heap.pop();//判断是否为空Heap.empty();//头文件#include<queue>
<3>自定义优先级
添加元素为结构体需要重载'<'
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,所以不要重载>#include<iostream>#include<stdio.h>#include<queue>using namespace std;struct Node { //值 int value;//编号 int key; //重载操作符 friend bool operator < (Node node1,Node node2) { //最大优先队列 return node1.value < node2.value; }/*不要重载这个'>'只重载'<'friend bool operator > (Node node1,Node node2) { return node1.value > node2.value; } */};struct Node2 { //值 int value;//编号 int key; //重载操作符 friend bool operator < (Node2 node1,Node2 node2) { //最小优先队列 return node1.value > node2.value; }};int main(){int i;//实例一 结构体1Node b[5];b[0].value = 6; b[0].key = 1; b[1].value = 9; b[1].key = 2; b[2].value = 2; b[2].key = 3; b[3].value = 8; b[3].key = 4; b[4].value = 1; b[4].key = 5; //最大优先队列priority_queue<Node> Heap; //入队列for(i = 0;i < 5;i++){Heap.push(b[i]);}printf("最大优先队列:\n");//出队列for(i = 0;i < 5;i++){printf("key:%d value:%d\n",Heap.top().key,Heap.top().value);Heap.pop();}//实例二 结构体2Node2 b2[5];b2[0].value = 6; b2[0].key = 1; b2[1].value = 9; b2[1].key = 2; b2[2].value = 2; b2[2].key = 3; b2[3].value = 8; b2[3].key = 4; b2[4].value = 1; b2[4].key = 5; //最大优先队列priority_queue<Node2> Heap2; //入队列for(i = 0;i < 5;i++){Heap2.push(b2[i]);}printf("最小优先队列:\n");//出队列for(i = 0;i < 5;i++){printf("key:%d value:%d\n",Heap2.top().key,Heap2.top().value);Heap2.pop();}return 0;}
题解:
其实这里q可以定义成
priority_queue<int> q[4];
#include <map>#include<string>#include <iostream>#include<queue>#include<algorithm>using namespace std;struct pat{int priority;int key;};bool operator < ( pat p1, pat p2) { if(p1.priority != p2.priority){ return p1.priority < p2.priority; } else{ return p1.key > p2.key; } } //priority_queue<int> :: iterator q; 优先队列不能用迭代器char str[100];char tt[10];int main(){string s,s1;int i,k,n,A,B,b;pat egpat;while(scanf("%d",&n)!=EOF){k=1;priority_queue<pat>q1,q2,q3;for(i=0;i<n;i++){scanf("%s",str);if(strcmp(str,"IN")==0){scanf("%d%d",&A,&B);egpat.key=k;egpat.priority=B;if(A==1)q1.push(egpat);else if(A==2)q2.push(egpat);elseq3.push(egpat);k++;}else{scanf("%d",&b);if(b==1){if(q1.empty())cout<<"EMPTY"<<endl;else{cout<<(q1.top()).key<<endl;q1.pop();}}else if(b==2){if(q2.empty())cout<<"EMPTY"<<endl;else{cout<<(q2.top()).key<<endl;q2.pop();}}else{if(q3.empty())cout<<"EMPTY"<<endl;else{cout<<(q3.top()).key<<endl;q3.pop();}}}}}return 0;}
0 0
- hdu C++模版题目(优先队列)
- 优先队列模版
- HDU 1285 <优先队列+拓扑排序> <拓扑模版>
- hdu 4006 (优先队列)
- hdu 4393(优先队列)
- HDU Stones(优先队列)
- 优先队列题目
- 优先队列(C++/Java)
- hdu 2680 Choose the best route(dijkstra 优先队列+堆 附模版)
- HDU 1026 (BFS + 优先队列)
- hdu 1236 排名(优先队列)
- hdu 1242Rescue(bfs+优先队列)
- hdu 1026(优先队列+BFS)
- hdu 1242 Rescue (优先队列+bfs)
- hdu 1026 (优先队列+bfs)
- HDU 1242 Rescue(BFS +优先队列)
- hdu 2850(贪心+优先队列)
- hdu 2822 Dogs(优先队列)
- Android线程池
- hadoop的linux配置
- LINGO自学笔记
- 你所不知道的地震APP
- CKEditor和UEditor使用比较
- hdu C++模版题目(优先队列)
- Linux远程下载文件的两种方法之 ftp命令和scp命令
- Linux wext和nl80211接口简介
- 【UVA】11400-Lighting System Design(动态规划)
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- 猜数字游戏
- hd 2027 统计元音
- Swiftly语言学习1
- 最奇特的编程语言特征