poj 3253 huffman(切木棍)

本文介绍了一种使用哈弗曼逆策略来解决木棍切割问题的方法,目的是将一根木棍切成给定长度的同时,使切割的总成本最小化。通过构建哈弗曼树并采用特定的切割策略,可以有效地求解此问题。

题意:切木棍,切一刀的花费是木棍的长度。要求把木棍切成给定的长度,问最小花费。

思路:切木棍的策略为哈弗曼的逆。

输入:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值