输入
输入一共有2行。
第一行为一个整数n,它表示点的个数。
第二行有n(1 < n <= 1000)个数,第i(1 <= i <= n)个数表示第i个点的权值
输出
输出为一个数,为最小造价值。
输入样例 1 点击复制
7 1 2 3 4 5 6 7
输出样例 1
74
#include <stdio.h>
#include <stdlib.h>
// 定义最大节点数,为了处理最多1000个节点
#define MAX_NODES 1000
// 自定义最小堆,用于存储节点权值
int heap[MAX_NODES];
int heapSize;
void insertHeap(int value) {
int i = heapSize;
heapSize++;
// 向上调整堆
while (i > 0 && value < heap[(i - 1) / 2]) {
heap[i] = heap[(i - 1) / 2];
i = (i - 1) / 2;
}
heap[i] = value;
}
int removeMin() {
int min = heap[0];
int last = heap[--heapSize];
int i = 0;
// 向下调整堆
while ((i * 2 + 1) < heapSize) {
int j = i * 2 + 1;
if (j + 1 < heapSize && heap[j + 1] < heap[j]) {
j++;
}
if (last <= heap[j]) {
break;
}
heap[i] = heap[j];
i = j;
}
heap[i] = last;
return min;
}
int main() {
int n;
scanf("%d", &n);
heapSize = 0;
// 读取权值并添加到堆中
for (int i = 0; i < n; i++) {
int weight;
scanf("%d", &weight);
insertHeap(weight);
}
int totalCost = 0;
// 循环,直到堆中只剩下一个元素
while (heapSize > 1) {
int left = removeMin();
int right = removeMin();
int merged = left + right;
totalCost += merged;
insertHeap(merged);
}
printf("%d\n", totalCost);
return 0;
}