问题描述:
操场四周有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小
输入:
4
4 4 5 9
输出:
43
代码:
#include <iostream>
#include<queue>
using namespace std;
int main()
{int n;
scanf("%d",&n);
priority_queue<int,vector<int>,greater<int> >q;
for(int i=0;i<n;i++){
int a;
scanf("%d",&a);
q.push(a);
}
//计算最小得分
int sum=0;
while(q.size()>1){//这里判断条件千万不能是队列为空,否则会出错,应该当队列只剩下一个元素的时候就停止循环。
int a=q.top();
q.pop();
int b=q.top();
q.pop();
sum+=(a+b);
q.push(a+b);
// printf("%d\n",q.top());
//q.pop();
}
printf("%d\n",sum);
return 0;
}
小结:使用了优先级队列来求哈夫曼树的最小带权路径长度。