POJ——3253 Fence Repair

题目链接:http://poj.org/problem?id=3253

题目大意:

农夫Jhon想要把一块木板切成N(1<=N<=20000)块,每块木板长度为Li(1<=Li<=50000),它买了一块长木板,长度刚好是这N个木板长度的总和。他每次切木板时,开销正好是这块木板的长度,例如,一块长度为21的木板想要切成5,8,8,首先将长度为21的木板切成13和8,开销是21,然后将长度为13的木板切成5和8,开销是13,于是总开销是34。问切割出N块木板所需的最小开销是多少。

输入:

行1:整数N

行2-(N+1):单一整数,表示每块木块的长度Li

输出:

行1:切割出N块木板所需的最小开销

分析:

切割木板的情形可以使用二叉树来表示:

总开销就是叶子节点的值和深度的乘机和。

最佳切割方法应该是最短的木块与次短的木块应当是兄弟节点,也就是哈夫曼树。

源码:

#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long ll;

int N;
int L[20005];

void selectSort(int s)
{
	int i;
	
	for(i = s; i < N-1; ++i)
	{
		if(L[i] > L[i+1])
		{
			swap(L[i], L[i+1]);
		}
		else
		{
			break;
		}
	}
}

int main() {
	int i;
	ll sum = 0;
	
	scanf("%d", &N);
	for(i = 0; i < N; ++i)
	{
		scanf("%d", &L[i]);
	}
	
	sort(L, L+N);
	
	for(i = 0; i < N-1; ++i)
	{
		L[i+1] += L[i];
		sum += L[i+1];
		selectSort(i+1);
	}
	
	printf("%lld\n", sum);
	
	return 0;
}

 

转载于:https://my.oschina.net/jjyhll/blog/713538

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值