输入
输入一共有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;
}