题目题解: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=;
for(int i=; i<=n; i++)
{
scanf("%d",&a);
q.push(a);
}
if(n==)
{
printf("%d\n",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\n",count);
} }
return ;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio> #include <queue>//队列的头文件 using namespace std; int a[]; int main() {
int n,a1,a2,i; int sum=;
cin>>n;
for(i=;i<n;i++)
{
cin>>a[i];
}
priority_queue<int , vector<int> , greater<int> >q;//从小到大排列
for(i=;i<n;i++)
{
q.push(a[i]);//进入队列
}
while(q.size()>)//因为最后只剩下一组,所以控制长度大于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 ;
}

最新文章

  1. 基于GPUImage的多滤镜rtmp直播推流
  2. AngularJS Best Practices: resource
  3. em 和 px相互转换
  4. HDFS snapshot操作实战
  5. UITableView
  6. window删除损坏无法打开的文件
  7. Falcon Genome Assembly Tool Kit Manual
  8. 转--Invalidate和postInvalidate的更新view区别
  9. 怎样去掉FireFox的导入向导
  10. 仿jQuery中undelegate()方法功能的函数
  11. MPlayerX For Mac白屏问题
  12. MVC 中引入Jquery文件的几种方法
  13. java多线程控制台聊天室(转)
  14. 转Fiddler 构造http请求
  15. Idea中:No converter found for return value of type: class java.util.ArrayList:Json格式转换问题
  16. 编程感悟-建立好代码sop
  17. Nginx配置项优
  18. python写service时全局变量问题
  19. $(document).ready和window.onload 简单分析区别
  20. 使用ImageMagick 在图片上绘制粗斜体的中文也许是一个错误。

热门文章

  1. sklearn算法库的顶层设计
  2. web应用安全防范(1)—为什么要重视web应用安全漏洞
  3. 如何区分slice、splice和split
  4. Coding和Git的环境搭建
  5. mysql概要(二)类型(数值型,字符型,时间类型
  6. linux消息队列编程实例
  7. python操作数据库PostgreSQL
  8. python转化字符串形式的json
  9. ZOJ 3993 - Safest Buildings - [数学题]
  10. iOS-相关集合类