题目描述
在一个操场的四周摆放着n 堆石子。每堆的石子数不超过10*n。现要将石子有次序地合并成一堆。规定每次只能选2 堆石子合并成新的一堆,合并的费用为新的一堆的石子数。
试设计一个线性时间算法,计算出将n堆石子合并成一堆的最小总费用。
对于给定n堆石子,计算合并成一堆的最小总费用。
试设计一个线性时间算法,计算出将n堆石子合并成一堆的最小总费用。
对于给定n堆石子,计算合并成一堆的最小总费用。
输入
输入数据的第1 行是正整数n,表示有n堆石子。第2 行有n个数,分别表示每堆石子的个数。n≤100000。
输出
将计算出的最小总费用输出。
示例输入
6 45 13 12 16 9 5
示例输出
224
优先队列,老简单了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int main()
{
int a[100010];
int n;
priority_queue<int ,vector<int>,greater<int> >q;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
q.push(a[i]);
}
int x,y,ans,sum=0;
while(!q.empty())
{
x=q.top();
q.pop();
if(q.empty()==true)
{
break;
}
y=q.top();
q.pop();
ans=x+y;
sum+=ans;
q.push(ans);
}
printf("%d\n",sum);
return 0;
}