• C++(STL)&&树-堆结构练习——合并果子之哈夫曼树


    题目题解:http://blog.csdn.net/xu12110501127/article/details/9199335

    有关博客:http://www.360doc.com/content/10/1118/16/963301_70454649.shtml 优先队列不错的博客。

    priority_queue 对于基本类型的使用方法相对简单。
    他的模板声明带有三个参数,priority_queue<Type, Container, Functional>
    Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
    Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
    STL里面默认用的是 vector. 比较方式默认用 operator< ,

     所以如果你把后面俩个
    参数 缺省的话,优先队列就是大顶堆,队头元素最大。

     

    如果要用到小顶堆,则一般要把模板的三个参数都带进去。
    STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
    例子:

    复制代码
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue>
     4 #include <vector>
     5 #include <algorithm>
     6 #define LL long long
     7 using namespace std;
     8 
     9 struct node
    10 {
    11     int x, y;
    12     bool operator < (const node &tmp)const
    13     {
    14         return x > tmp.x;
    15     }
    16 };
    17 int main()
    18 {
    19     priority_queue<int>q1;  //基本类型从大到小
    20     priority_queue<int, vector<int>, greater<int> >q2;  //基本类型从小到大
    21     priority_queue<node>q3;  //自定义类型
    22     return 0;
    23 }

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/A
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <queue>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int n,a,sum,sum1;
        long long int count;
        priority_queue<int, vector<int>, greater<int> >q;
        while(scanf("%d",&n)!=EOF)
        {
            count=0;
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&a);
                q.push(a);
            }
            if(n==1)
            {
                printf("%d
    ",count);
                continue;
            }
            else
            {
                while(!q.empty())
                {
                    sum=q.top();
                    q.pop();
                    if(q.empty())
                    {
                        break;
                    }
                    sum1=q.top();
                    q.pop();
                    q.push(sum+sum1);
                    count=count+sum+sum1;
                }
                printf("%d
    ",count);
            }
    
        }
        return 0;
    }
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    
    #include <queue>//队列的头文件
    
    using namespace std;
    
    int a[10000];
    
    int main()
    
    {
        int n,a1,a2,i;
    
        int sum=0;
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        priority_queue<int , vector<int> , greater<int> >q;//从小到大排列
        for(i=0;i<n;i++)
        {
            q.push(a[i]);//进入队列
        }
        while(q.size()>1)//因为最后只剩下一组,所以控制长度大于1
        {
            a1=q.top();//将a1定义为首元素
            q.pop();//出队列
            a2=q.top();//将a2定义为首元素
            q.pop();//出队列
            sum+=a1+a2;
            q.push(a1+a2);//这里注意将a1+a2进入队列,而不是sum
        }
        cout<<sum<<endl;//最后输出sum
        return 0;
    }
  • 相关阅读:
    二次冲刺站立会议七
    二次冲刺站立会议六
    二次冲刺站立会议五
    二次冲刺站立会议四
    二次冲刺站立会议三
    二次冲刺站立会议二
    二次冲刺站立会议一
    Linux课程学习总结
    仿知乎专栏的软件系统设计方案
    仿知乎专栏的需求分析和概念原型
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3893928.html
Copyright © 2020-2023  润新知