zoukankan      html  css  js  c++  java
  • 51nod 1117 聪明的木匠(哈夫曼树构造+优先队列)本质是贪心

    题目来源: 河北大学算法艺术协会
    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
    收藏
    关注
    取消关注
    一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN(1 <= L1,L2,…,LN <= 1000,且均为整数)个长度单位。我们认为切割时仅在整数点处切且没有木材损失。
    木匠发现,每一次切割花费的体力与该木棒的长度成正比,不妨设切割长度为1的木棒花费1单位体力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,则木棒原长为12,木匠可以有多种切法,如:先将12切成3+9.,花费12体力,再将9切成4+5,花费9体力,一共花费21体力;还可以先将12切成4+8,花费12体力,再将8切成3+5,花费8体力,一共花费20体力。显然,后者比前者更省体力。
    那么,木匠至少要花费多少体力才能完成切割任务呢?
    Input
    第1行:1个整数N(2 <= N <= 50000)
    第2 - N + 1行:每行1个整数Li(1 <= Li <= 1000)。
    Output
    输出最小的体力消耗。
    Input示例
    3
    3
    4
    5
    Output示例
    19

    分析:了解哈夫曼树的知识并学会使用优先队列就很好解这道题了。

    #include <cstdio>
    #include <iostream>
    #include <queue>
    using namespace std;
    typedef long long ll;
    priority_queue<ll,vector<ll>,greater<ll> > que;
    int main()
    {
        ll n;
        ios::sync_with_stdio(false);
        cin>>n;
        while(!que.empty())
            que.pop();
        for(ll i=0;i<n;i++)
        {
            ll tmp;
            cin>>tmp;
            que.push(tmp);
        }
        ll ans=0;
        while(que.size()>=2)
        {
            ll x=que.top();
            que.pop();
            ll y=que.top();
            que.pop();
            ll z=x+y;
            que.push(z);
            ans+=z;
            cout<<ans<<endl;
        }
        cout<<ans<<endl;
        return 0;
    }
    

      

     
  • 相关阅读:
    ADERA3 省选模拟赛 SPOJ LMCONST
    TYVJ 1730 二逼平衡树 线段树套平衡树
    BZOJ 1059 [ZJOI2007]矩阵游戏 二分图匹配
    BZOJ 1056 [HAOI2008]排名系统 Splay+Hash
    OI教会我的
    BZOJ 1055 [HAOI2008]玩具取名 DP
    BZOJ 1058 [ZJOI2007]报表统计 Splay
    为自己而奋斗
    [总结]高斯消元&XOR方程
    我 的 2013
  • 原文地址:https://www.cnblogs.com/onlyli/p/7301002.html
Copyright © 2011-2022 走看看