用C语言编写一个程序完成下列题目,题目描述 小K没事干,他要搬砖头,为了达到较好的减肥效果,教练规定的方式很特别: 每一次,小K可以把两堆砖头合并到一起,消耗的体力等于两堆砖头的重量之和。 经过 n-1次合并后, 就只剩下一堆了。小K在搬砖头时总共消耗的体力等于每次合并所耗体力之和。小K为了偷懒,希望耗费的体力最小。 例如有 3堆砖头,数目依次为 1、2、9 。可以先将 1 、 2 堆合并,新堆数目为3 ,耗费体力为 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 ,耗费体力为12 。所以总共耗费体力 =3+12=15。可以证明 15为最小的体力耗费值。 输入要求 共两行。 第一行是一个整数 n(1≤n≤1000) ,表示砖头堆数。 第二行n个整数,每个整数表示每堆砖头的砖头块数。 输出要求 一个整数,也就是最小的体力耗费值。 输入样例 3 1 2 9 输出样例 15
时间: 2024-02-06 19:12:07 浏览: 87
好的,以下是用 C 语言编写的程序,可以实现该功能:
```
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int n;
scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), cmp);
int ans = 0;
for (int i = 1; i < n; i++) {
a[i] += a[i - 1];
ans += a[i];
}
printf("%d\n", ans);
free(a);
return 0;
}
```
程序思路如下:
1. 先输入砖头堆数 n,然后动态申请一个长度为 n 的数组 a 来存储每堆砖头的砖头块数。
2. 利用 qsort 函数对数组 a 进行排序。
3. 从第二堆开始,每次将前面两堆合并,更新数组 a 的值。同时,累加每次合并所耗体力之和。
4. 最后输出累加值 ans 即可。
需要注意的是,由于数组 a 是动态申请的,使用完毕后需要手动释放内存。
阅读全文