生活中我们会遇到各种各样的队列的问题,在C语言中,也有几类关于队列的问题:
普通队列.链队列.循环队列.优先队列( 算法中应用最为广泛,常出现在BFS中
);
今天就在这里总结一下有关优先队列的一些用法:
优先队列:
对于一般的队列,遵循的是简单地FIFO( first input first output )[ 先进先出 ]的原则;
这一点与栈的特性正好相反;
对于优先队列,特点不是先进先出,而是满足一定条件的元素先出队( 例如,每次都是最大的元素出队 ).
一、声明方法:
优先队列的定义包含在头文件:#include<queue> 中;
1. 普通方法:
2. 自定义优先级:
struct cmp
{
operator bool ()(int x, int y)
{
return x > y; // 从小到大输出
}
};
priority_queue<int, vector<int>, cmp>q;//定义方法
struct node
{
int x, y;
bool operator < (node a, node b)//从小到大输出
{
return a.x > b.x; //x小的优先级高
}
};
priority_queue<node>q;//定义方法
题目:
1 3 1 2 9
15
分析: 每次把最小的两个和从队列抽出( top(),pop() ),求和之后再放回队列( push() );
一直到队列中只剩下一个元素( 即最大值 );清零队列;输出;
AC代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
priority_queue<long long int,vector<long long int>,greater<long long int> >q;
int main()
{
int t,n,m,i;
long long int l,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&m);
q.push(m);
}
l=0;
while(q.size() !=1)
{
x=q.top();
q.pop();
y=q.top();
q.pop();
x+=y;
l+=x;
q.push(x);
}
while(!q.empty())//重点::清空数列
{
q.pop();
}
printf("%lld\n",l);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Num 22 : NYOJ : 0055 懒省事的小明 [ 优先队列 ]
原文:http://blog.csdn.net/helloworldonly/article/details/47318627