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;
    }
    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    tftp服务、串口工具minicom
    意外的“黄金点”
    软件工程实践总结
    关于 K米 —— 的案例分析
    关于git的学习
    第二次作业_需求分析与原型设计
    安装appium
    淘宝
    Selenium API基础 8种定位
    selenium
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7168293.html
Copyright © 2011-2022 走看看