C++STL容器学习总结之五:优先队列priority_queue

>>>C++STL容器学习总结之一:向量vector<<<

>>> C++STL容器学习总结之二:链表list<<<

>>>C++STL容器学习总结之三:双端队列deque<<<

>>>C++STL容器学习总结之四:队列queue<<<

>>>C++STL容器学习总结之六:栈stack<<<

>>>C++STL容器学习总结之七:集合set<<<

>>>C++STL容器学习总结之八:映射map<<<


优先队列priority_queue

1.调用头文件:

#include<queue>

using namespace std;


2.详细用法(部分):

priority_queue<Type> k;      ------      定义一个有序队列(默认从小到大排,其顶端元素为最大的那个)

priority_queue<(队列中元素的数据类型), (用于储存和访问队列元素的底层容器的类型), (比较规则) > k      ------   

(标准式)定义一个有序队列

例如:priority_queue<int, vector<int>, greater<int> > k;(注意:比较规则后面必须要空上一格) ->定义一个有序队列,

排序规则为从大到小(其顶端元素为最小的那个)(greater为从小到大,顶端最小,less为从大到小,顶端最大)

k.empty()      ------      查看是否为空范例,是的话返回1,不是返回0

k.push(i)      ------      从已有元素后面增加元素i(队伍大小不预设)

k.pop()      ------      清除位于顶端的元素(当然是排完序后,下同)

k.top()      ------      显示顶端的元素

k.size()      ------      输出现有元素的个数


例题:

问题概述:有n个土堆,每个土堆都有一定重量,你每次可以将任意两个土堆合并成一个大土堆,并消耗同等于两个

土堆总质量的体力,请问你至少需要多少体力才可以将所有土堆合成一个

输入样例:                         对应输出:

10                                       105

8

1 2 8 7 6 9 2 3


思路:很显然,每次都将当前最轻的两个土堆合成一个大土堆即可

代码

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int main(void)
{
	int T, n, x, i, a, b;
	long long sum;
	scanf("%d", &T);
	while(T--)
	{
		sum = 0;
		priority_queue<int, vector<int>, greater<int> > q;  /*建立一个队列,其中队列顶端为最小值*/
		scanf("%d", &n);
		for(i=1;i<=n;i++)
		{
			scanf("%d", &x);
			q.push(x);
		}
		while(q.empty()==0)
		{
			a = q.top();   /*弹出质量最小的两个土堆并合并*/
			q.pop();
			if(q.empty()==1)   /*当然如果只剩下一个土堆了就结束*/
				break;
			b = q.top();
			q.pop();
			q.push(a+b);      /*合并之后入队*/
			sum += a+b;
		}	
		printf("%lld\n", sum);
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_24016309/article/details/88540427