题目大意:
将一很长的木板切割成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;
}