热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(转)优先队列的用法附:poj2442poj1442

priority_queue调用STL里面的make_heap(),pop_heap(),push_heap()算法实现,也算是堆的另外一种形式。先写一个用STL里面

priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解

?
#include
#include
#include
using namespace std;
class priority_queue
{
    private:
        vector<int> data;
         
    public:
        void push( int t ){
            data.push_back(t);
            push_heap( data.begin(), data.end());
        }
         
        void pop(){
            pop_heap( data.begin(), data.end() );
            data.pop_back();
        }
         
        int top() { return data.front(); }
        int size() { return data.size(); }
        bool empty() { return data.empty(); }
};
int main()
{
    priority_queue test;
    test.push( 3 );
    test.push( 5 );
    test.push( 2 );
    test.push( 4 );
     
    while( !test.empty() ){
        cout <
        test.pop(); }
         
    return 0;
}
STL里面的 priority_queue 写法与此相似&#xff0c;只是增加了模板及相关的迭代器什么的。 

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue
其中Type 为数据类型&#xff0c; Container 为保存数据的容器&#xff0c;Functional 为元素比较方式。
Container 必须是用数组实现的容器&#xff0c;比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator<, 所以如果你把后面俩个参数缺省的话&#xff0c;
优先队列就是大顶堆&#xff0c;队头元素最大。
?
#include
#include
using namespace std;
int main(){
    priority_queue<int> q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i ) q.push( rand() );
    while( !q.empty() ){
        cout <
        q.pop();
    }
     
    getchar();
    return 0;
}
如果要用到小顶堆&#xff0c;则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>&#xff0c;对于基本类型可以用这个仿函数声明小顶堆
?
#include
#include
using namespace std;
int main(){
    priority_queue<int, vector<int>, greater<int> > q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i ) q.push( rand() );
    while( !q.empty() ){
        cout <
        q.pop();
    }
     
    getchar();
    return 0;
}

 

对于自定义类型&#xff0c;则必须自己重载 operator<或者自己写仿函数
?
#include
#include
using namespace std;
struct Node{
    int x, y;
    Node( int a&#61; 0, int b&#61; 0 ):
        x(a), y(b) {}
};
bool operator<( Node a, Node b ){
    if( a.x&#61;&#61; b.x ) return a.y> b.y;
    return a.x> b.x;
}
int main(){
    priority_queue q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout <&#39; &#39; <
        q.pop();
    }
     
    getchar();
    return 0;
}

 

自定义类型重载 operator<后&#xff0c;声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue, greater >;
原因是 greater 没有定义&#xff0c;如果想用这种方法定义则可以按如下方式:
?
#include
#include
using namespace std;
struct Node{
    int x, y;
    Node( int a&#61; 0, int b&#61; 0 ):
        x(a), y(b) {}
};
struct cmp{
    bool operator() ( Node a, Node b ){
        if( a.x&#61;&#61; b.x ) return a.y> b.y;
         
        return a.x> b.x; }
};
int main(){
    priority_queue, cmp> q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout <&#39; &#39; <
        q.pop();
    }
     
    getchar();
    return 0;
}
//以上代码实现的是一个小顶堆

 

转载:http://blog.chinaunix.net/space.php?uid&#61;533684&do&#61;blog&cuid&#61;2615612

ps:如果重载operator > 可直接使用priority_queue,greater>

poj 2442 

题目&#xff1a;http://poj.org/problem?id&#61;2442

代码&#xff1a;

View Code

1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 bool cmp(int a,int b)
7 {
8 return a<b;
9 }
10 int main()
11 {
12 int m,n,t;
13 cin>>t;
14 int num1[2010];
15 int num2[2010];
16 int i,j,k,s;
17 priority_queue<int,deque<int>,less<int> > que;
18 while(t--)
19 {
20 cin>>m>>n;
21 for(i&#61;0;i)
22 {
23 cin>>num1[i];
24 }
25 sort(num1,num1&#43;n,cmp);
26 for(i&#61;1;i)
27 {
28 for(j&#61;0;j)
29 {
30 cin>>num2[j];
31 que.push(num1[0]&#43;num2[j]);
32 }
33 sort(num2,num2&#43;n,cmp);
34 for(k&#61;1;k)
35 {
36 for(s&#61;0;s)
37 {
38 if(num1[k]&#43;num2[s]>que.top())
39 break;
40 que.pop();
41 que.push(num1[k]&#43;num2[s]);
42 }
43 }
44 for(k&#61;0;k)
45 {
46 num1[n-k-1]&#61;que.top();
47 que.pop();
48 }
49 }
50 for(i&#61;0;i)
51 {
52 printf("%d",num1[i]);
53 if(i&#61;&#61;n-1)
54 printf("\n");
55 else
56 printf(" ");
57 }
58 }
59 return 0;
60 }

 poj 1442

题目&#xff1a;http://poj.org/problem?id&#61;1442

利用的是维护两个堆的思想&#xff0c;从1~i-1建立大顶堆&#xff0c;i~k建立小顶堆&#xff0c;k是当前时刻ADD个数&#xff0c;堆利用优先队列实现。。。

View Code

1 #include
2 #include
3 #include
4 using namespace std;
5 int main()
6 {
7 priority_queue<int>que;
8 priority_queue<int,vector<int>,greater<int> >q;
9 int a[30010];
10 int n,i,m;
11 cin>>m>>n;
12 for(i&#61;0;i)
13 {
14 scanf("%d",&a[i]);
15 }
16 int uu&#61;0;
17 int h&#61;0;
18 int t,u;
19 for(i&#61;1;i<&#61;n;i&#43;&#43;)
20 {
21 scanf("%d",&t);
22 u&#61;t-h;
23 while(u)
24 {
25 q.push(a[uu]);
26 uu&#43;&#43;;
27 if(!que.empty()&&que.top()>q.top())
28 {
29 que.push(q.top());
30 q.pop();
31 q.push(que.top());
32 que.pop();
33 }
34 u--;
35 }
36 h&#61;t;
37 cout<endl;
38 que.push(q.top());
39 q.pop();
40 }
41 return 0;
42 }

 

 

 

 

 

 

 

 

 

 

 

 

转:https://www.cnblogs.com/wanglin2011/archive/2013/01/21/2869891.html



推荐阅读
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了SPOJ2829题目的解法及优化方法。题目要求找出满足一定条件的数列,并对结果取模。文章详细解释了解题思路和算法实现,并提出了使用FMT优化的方法。最后,对于第三个限制条件,作者给出了处理方法。文章最后给出了代码实现。 ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 给出一群女孩的重量和颜值和她们的朋友关系现在有一个舞台ab是朋友bc是朋友ac就是朋友给出最大承重可以邀请这些女孩来玩对于每一个朋友团体全邀请or邀请一个or不邀请问能邀请的女孩的 ... [详细]
author-avatar
millottgerould
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有