合并果子
题目
输入
输出
输入样例
3
1 2 9
输出样例
15
解题思路
我们这题用的是二叉堆,我们每次合并最小的两堆,先把所有树插入小根堆,每次取出当前最小的两个数
然后把它们的和放回堆
程序如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n, ans, a[10001];
priority_queue<int,deque<int>,greater<int> > q;//建小根堆
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&a[i]);
q.push(a[i]);//插入堆
}
while(q.size() > 1)
{
int x = q.top();//堆顶是最小的
q.pop();//弹出
int y = q.top();
q.pop();
q.push(x + y); //将最小和插入原来的堆顶
ans += (x + y);//求和
}
printf("%d",ans);
return 0;
}