标签:simple example nyoj c语言 优先队列
生活中我们会遇到各种各样的队列的问题,在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 懒省事的小明 [ 优先队列 ]
标签:simple example nyoj c语言 优先队列
原文地址:http://blog.csdn.net/helloworldonly/article/details/47318627