本题采用了哈夫曼树:
一开始想到的是动态规划,但是动态规划有一个弊端是由于木头切割完了之后顺序是不知道的,按照任意顺序切割答案是不同的,可能更换摆放顺序之后得不到最小的答案,只能得到按照固定顺序的答案
然后发现了哈夫曼树:它的意义是让小的木头组合,组成的和与大木头差距不大的时候,损失小。这样的话差距不大的木头组合起来可以得到最优解比如说长度为100的木头要切割成100块,应该每次都从中间切,而不是每次切下长度为1的树
也就是说主要目的是减少切割次数减少钱,而不是增加切割次数减少木头长度减少钱
代码如下
#include<stdio.h>
int a[100000];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//先排序复杂度为n^2
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
if(a[j]>a[j+1])//小的放在前面
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
int sum=0;
for(int i=0;i<n-1;i++)
{
int k=a[i]+a[i+1];
sum=sum+k;
int j=i+2;
while(j<n&&a[j]<k)//放进去的时候要排序(按顺序放入)
{
a[j-1]=a[j];
j++;
}
a[j-1]=k;
}
printf("%d",sum+a[n]);
}