合并果子
题目

输入

输出

输入样例
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;
}
这篇博客介绍了一种利用二叉堆解决合并果子问题的方法。通过建立小根堆,每次合并堆中最小的两个元素并更新总和,直至堆的大小小于2。程序实现了这一过程,并给出了具体的C++代码实现。最终输出了合并后的总和。
195

被折叠的 条评论
为什么被折叠?



