zoukankan      html  css  js  c++  java
  • POJ 3253 STL优先队列

    题目大意:FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods)。开始时,FJ只有一块无限长的木板,因此他需要把无限长的木板锯成 N 块长度

    为 Li 的木板,Farmer Don提供FJ锯子,但必须要收费的,收费的标准是对应每次据出木块的长度,比如说测试数据中 5 8 8,一开始,FJ需要在无限长的木板上锯下长度 21 的木板(5+8+8=21),第二次锯下长度为 5 的木板,第三次锯下长度为 8 的木板,至此就可以将长度分别为 5 8 8 的木板找出

    题目可以转化为Huffman树构造问题 :

    给定 N planks of woods,

    1. 在 N planks 中每次找出两块长度最短的木板,然后把它们合并,加入到集合A中,
    2. 在集合中找出两块长度最短的木板,合并加入到集合A中,重复过程,直到集合A中只剩下一个元素

    显然,通过每次选取两块长度最短的木板,合并,最终必定可以合并出长度为 Sum(Li)的木板,并且可以保证总的耗费最少
    转自:http://blog.sina.com.cn/s/blog_6635898a0100msyo.html

    Huffman 树,这么高端的名字,原来也没有接触过。。 就这么直接转化成了运用STL的水题了。代码只有短短20行。(佩服手写堆的大神们)

    // by Sirius_Ren
    #include <cstdio>
    #include <queue>
    using namespace std;
    int main()
    {
        register int n,xx;
        register long long jya,jyb,ans=0;
        while(~scanf("%d",&n)){
            priority_queue<long long,vector<long long>,greater<long long> >pq;
            for(int i=1;i<=n;i++)scanf("%d",&xx),pq.push(xx);
            while(pq.size()!=1){
                jya=pq.top();pq.pop();
                jyb=pq.top();pq.pop();
                pq.push(jya+jyb);
                ans+=jya+jyb;
            }
            printf("%lld
    ",ans);
        }
    }

    这里写图片描述

  • 相关阅读:
    成绩
    多态与异常处理
    大道至简终结版
    继承与接口
    大道至简之编程到工程
    数组元素相加
    数组元素必须具有相同的数据类型?
    大道至简之失败的过程也是过程
    作业
    感想之流于形式的沟通
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532465.html
Copyright © 2011-2022 走看看