priority_queue队列:
调用头文件:
#include<queue>
using namespace std;
详细用法(部分):
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() ------ 输出现有元素的个数
http://www.jb51.net/article/41648.htm
问题概述:有n个土堆,每个土堆都有一定重量,你每次可以将任意两个土堆合并成一个大土堆,并消耗同等于两个
土堆总质量的体力,请问你至少需要多少体力才可以将所有土堆合成一个
输入样例: 对应输出:
10 105
8
1 2 8 7 6 9 2 3
思路:很显然,每次都将当前最轻的两个土堆合成一个大土堆即可
#include<functional>
#include<stdio.h>
#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;
}