热门标签 | 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



推荐阅读
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 本文详细探讨了在PHP中实现毫秒级时间戳的技术方案,重点讲解了如何处理 `microtime` 函数的返回值以获取高精度时间戳。通过具体的示例代码,展示了该方法的简便性和实用性,适合需要精确时间记录的应用场景。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
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社区 版权所有