贪心算法 POJ3253 Fence Repair

来源:互联网 发布:幸运28网站源码2016 编辑:程序博客网 时间:2024/06/05 11:23

题目大意:

将一很长的木板切割成N块。每块长度分别为L1、L2、... 、LN,每次切断木板时需要的开销为这块木板的长度。

我的理解:

这道题属于贪心算法类型,在做的时候要用到哈夫曼编码。

代码:

#include <iostream>#include <cstdio>#include <algorithm>#define MAX_N 20000using 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;}