功能一
void min_heapify(int arr[],int n, int i){
int j, temp;
temp = arr[i];
j = 2 * i;
while (j <= n)
{
if (j < n && arr[j+1] < arr[j])
j = j + 1;
if (temp < arr[j])
break;
else if (temp >= arr[j])
{
arr[j/2] = arr[j];
j = 2 * j;
}
}
arr[j/2] = temp;
}
功能二
void max_heapify(int arr[], int n, int i)
{
int largest = i; // Initialize largest as root
int l = 2*i + 1; // left = 2*i + 1
int r = 2*i + 2; // right = 2*i + 2
// If left child is larger than root
if (l < n && arr[l] < arr[largest])
largest = l;
// If right child is larger than largest so far
if (r < n && arr[r] < arr[largest])
largest = r;
// If largest is not root
if (largest != i)
{
swap(arr[i], arr[largest]);
// Recursively heapify the affected sub-tree
heapify(arr, n, largest);
}
}
问题详情
在这里,堆化的工作方式与制作 min_heap 的方式相同,但问题是,我在下面的问题中使用堆来解决它,但不幸的是,我通过观看 MIT 讲座实现的函数 2 在查看了一段时间后并没有解决这个问题我发现第一个功能可以无缝地解决这个问题。我只是困惑它们不是相同的功能吗?------
问题
是的!!问题名称反映了您的任务;只需添加一组数字。但是你可能会觉得自己居高临下,编写一个 C/C++ 程序只是为了添加一组数字。这样的问题只会质疑你的博学。所以,让我们为它添加一些独创性的味道。
加法运算现在需要成本,成本是要相加的两者的总和。所以,加 1 和 10,你需要 11 的成本。如果你想加 1、2 和 3。有几种方法——</p>
1 + 2 = 3, cost = 3
1 + 3 = 4, cost = 4
2 + 3 = 5, cost = 5
3 + 3 = 6, cost = 6
2 + 4 = 6, cost = 6
1 + 5 = 6, cost = 6
Total = 9
Total = 10
Total = 11
我希望您已经了解您的任务,即添加一组整数以使成本最小化。
输入
每个测试用例都以一个正数 N (2 ≤ N ≤ 5000) 开始,后跟 N 个正整数(都小于 100000)。输入由 N 的值为零的情况终止。这种情况不应该处理。
输出
对于每种情况,在一行中打印最低总成本。
样本输入
3
1 2 3
4
1 2 3 4
0
样本输出
9
19