题意:切木棍,切一刀的花费是木棍的长度。要求把木棍切成给定的长度,问最小花费。
思路:切木棍的策略为哈弗曼的逆。
输入:
3
8
5
8
输出:
34
#include <stdio.h>
#include <string.h>
#define N 20005
int s[N],n,T;
void adjust(int i){
int x = s[i];
i <<= 1;
while(i<=n){
if(i+1<=n && s[i+1]<s[i])
i++;
if(x < s[i])
break;
s[i/2] = s[i];
i <<= 1;
}
s[i/2] = x;
}
int getmin(){
int x = s[1];
s[1] = s[n--];
adjust(1);
return x;
}
void insert(int x){
int i;
s[++n] = x;
i = n;
while(i>=1){
if(s[i/2] <= x)
break;
s[i] = s[i/2];
i >>= 1;
}
s[i] = x;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
int i;
__int64 res=0;
memset(s,0,sizeof(s));
for(i = 1;i<=n;i++)
scanf("%d",&s[i]);
for(i = n/2;i>=1;i--)
adjust(i);
T = n;
for(i = 1;i<T;i++){
int a = getmin();
int b = getmin();
res += (a+b);
insert(a+b);
}
printf("%I64d\n",res);
}
return 0;
}
本文介绍了一种使用哈弗曼逆策略来解决木棍切割问题的方法,目的是将一根木棍切成给定长度的同时,使切割的总成本最小化。通过构建哈弗曼树并采用特定的切割策略,可以有效地求解此问题。
1082

被折叠的 条评论
为什么被折叠?



