能否不使用STL呢,请再给我一份c++代码
时间: 2023-12-04 11:02:36 浏览: 63
当然可以,下面给出不使用STL的c++代码实现:
```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 10010;
int a[N];
int n;
void down(int u) // 堆排序的下沉操作
{
int t = u;
if(2 * u <= n && a[t] > a[2 * u]) t = 2 * u;
if(2 * u + 1 <= n && a[t] > a[2 * u + 1]) t = 2 * u + 1;
if(t != u) swap(a[u], a[t]), down(t);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = n / 2; i >= 1; i--) down(i); // 堆排序的建堆操作
long long ans = 0; // 注意答案可能会溢出
while(n > 1)
{
int x = a[1];
swap(a[1], a[n]);
n--;
down(1);
int y = a[1];
swap(a[1], a[n]);
n--;
down(1);
ans += x + y;
a[++n] = x + y;
down(n);
}
printf("%lld\n", ans);
return 0;
}
```
这里使用堆排序来实现小根堆,存储节点权重。每次从小根堆中取出最小的两个节点,合并成一个新的节点,并将其权重加入小根堆中。同时,计算合并后的节点的路径长度,将其累加到答案中。最终,当小根堆中只剩下一个节点时,哈夫曼树构建完成,返回答案即可。
阅读全文