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