zoukankan      html  css  js  c++  java
  • 【Huffman&&贪心】Fence Repair(POJ 3253)

    题目大意:

    农夫约翰为了修理栅栏,要将一块很长的木板切割成N块。准备切成的木板的长度为L1、L2、Ln,未切割前木板的长度恰好为切割后木板长度的总和。每次切断木板时,需要的开销为这块木板的长度。举个栗子,长21的木板切成5、8、8三块木板,21切成13和8时,开销为21;13切成5和8时开销13,所以合计开销是34。求将木板切割完最小的开销是多少。

    输入:

    3

    8

    5

    8

    输出:

    34

    分析:

    开销是由两个木板加起来的长度决定的,所以应每次取最小和次小的木板相加才能让总开销最小,因此想到Huffman,用priority_queue将最小和次小的pop,将他们的和push,直到队列的大小为1。

    程序代码:

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main()
    {
        int N;
        int t;
        int ans=0;
        priority_queue<int,vector<int>,greater<int> >q;
        cin>>N;
        for(int i=0;i<N;i++){
            cin>>t;
            q.push(t);
        }
         while(q.size()!=1){
            t=0;
            t+=q.top();
            q.pop();
            t+=q.top();
            q.pop();
            ans+=t;
            q.push(t);
         }
         cout<<ans<<endl;
        return 0;
    }
    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    jQuery事件篇---高级事件
    Cookie处理
    JDBC技术
    JSP行为
    JSP九大内置对象
    JSP指令学习
    Oracle数据库学习之存储过程--提高程序执行的效率
    数据库操作之游标
    PL/SQL编程接触
    数据库数据的查询----连接查询
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7168293.html
Copyright © 2011-2022 走看看