题目大意:
将一很长的木板切割成N块。每块长度分别为L1、L2、... 、LN,每次切断木板时需要的开销为这块木板的长度。
我的理解:
这道题属于贪心算法类型,在做的时候要用到哈夫曼编码。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAX_N 20000
using namespace std;
/**
哈夫曼树--贪心算法
思想:对于最优解来讲,最短的板应当是深度最大的叶子节点之一
*/
typedef long long ll;
int L[MAX_N];
int n;
void solve()
{
ll ans = 0;
while(n>1){
int mii1 = 0,mii2 = 1;
if(L[mii1] > L[mii2]) swap(mii1,mii2);
for(int i = 2;i<n;i++){
if(L[i] < L[mii1]){
mii2 = mii1;
mii1 = i;
}else if(L[i] < L[mii2]){
mii2 = i;
}
}
int t = L[mii1] + L[mii2];
ans += t;
if(mii1 == n-1) swap(mii1,mii2);
L[mii1] = t;
L[mii2] = L[n-1];
n--;
}
cout<<ans<<endl;
}
int main()
{
freopen("D:/OJ/挑战程序设计竞赛/FenceRepair.txt","r",stdin);
cin>>n;
for(int i = 0;i<n;i++){
cin>>L[i];
}
solve();
return 0;
}
本文介绍了一种使用哈夫曼树解决木板切割问题的方法,该问题要求将长木板切割成多段,目标是最小化切割总成本。通过构造哈夫曼树来确定最佳切割顺序,实现最小化每次切割的成本。
825

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



