每日刷题(五十一)
BASIC-28、Huffuman树
这个题还是蛮简单的,我这有点dp思维,就是定义两个数组,数组a存放输入的数据,数组cost用来记录每一次的费用,先把cost数组全都初始化为0。再做一个排序函数,先输入全部数据,然后排一次序,把前两个小的数之和放到数组cost里面。这个操作循环直到进行了n - 1次,然后最后再来个while循环,累加费用和。
详细C代码如下:
#include<stdio.h>
#include<string.h>
void sort(int a[], int n)
{
int i, j, t;
for(i = 0; i < n - 1; i++)
{
for(j = i + 1; j < n; j++)
{
if(a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
int a[n];
int i;
int cost[n];
memset(cost, 0, sizeof(cost));
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, n);
int j;
for(i = 0; i < n - 1; i++)
{
cost[i] = a[0] + a[1];
for(j = 0; j < n - 1 - i; j++)
{
if(j == 0)
a[j] = cost[i];
else
a[j] = a[j + 1];
}
sort(a, n - 1 - i);
}
i = 0;
int sum = 0;
while(cost[i] != 0)
{
sum += cost[i];
i++;
}
printf("%d\n", sum);
return 0;
}
样例运行结果如下: