堆--poj3253

来源:互联网 发布:青蚨在线网络贷款 编辑:程序博客网 时间:2024/06/06 02:31

题意:给几段切完了的木头,问原木棒如何切才能花费最少(花费为要切的木棒长度,比如刚开始21,切成13和8,然后切13的,花费为13)。

思路:用堆构造哈夫曼树,每次选出最大的两个元素,然后把她们的和重新放回堆中,直到堆中仅剩一个节点。

代码:

#include<iostream>#include<algorithm>using namespace std;const int maxn=20000+10;long n,len;long long p[maxn];void heap_insert(long long k){    long t=++len;    p[t]=k;    while(t>1)    {        if(p[t/2]>p[t])        {            swap(p[t/2],p[t]);            t/=2;        }        else            break;    }}void heap_adjust(){    long t=1;    p[t]=p[len--];    while(2*t<=len)    {        long long k=2*t;        if(p[k]>p[k+1]&&k<len)            ++k;        if(p[t]>p[k])        {            swap(p[t],p[k]);            t=k;        }        else            break;    }}int main(){    cin>>n;    for(long i=1; i<=n; i++)        cin>>p[i];    len=0;    for(int i=1; i<=n; i++)        heap_insert(p[i]);    long long ans=0;    while(len>1)    {        long long a,b;        a=p[1];        heap_adjust();        b=p[1];        heap_adjust();        ans+=a+b;        heap_insert(a+b);    }    cout<<ans<<endl;    return 0;}


 

原创粉丝点击