Fence Repair(挑战程序设计竞赛2.2)

来源:互联网 发布:淘宝店铺设置地址无效 编辑:程序博客网 时间:2024/06/16 04:57

木板切割,一开始以为是直接用贪心算法,每次将最大的那块单独分离开,思路错误。

实际上,它的模型是哈夫曼树问题,计算除根节点以外所有节点权值之和的最小值,也可以看做叶子节点的带权路径长度。

用优先队列可以使它每次出来两个最小的长度,将这两个长度加在最终消耗上,再把他们的和放回优先队列中。

#include"cstdio"#include"algorithm"#include"vector"#include"queue"using namespace std;int L[20005];int main(){    int n;    scanf("%d",&n);    priority_queue<int,vector<int>,greater<int> >pque;    for(int i=0;i<n;i++)    {        scanf("%d",&L[i]);        pque.push(L[i]);    }    int ans=0;    while(pque.size()>1)    {        int a,b;        a=pque.top();        pque.pop();        b=pque.top();        pque.pop();        ans=ans+a+b;        pque.push(a+b);    }    printf("%d\n",ans);    return 0;}

0 0
原创粉丝点击