1. 程式人生 > >【Huffman】Fence Repair(POJ 3253)

【Huffman】Fence Repair(POJ 3253)

blog pair 隊列 iostream man for 們的 柵欄 兩個

題目大意:

農夫約翰為了修理柵欄,要將一塊很長的木板切割成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; }

【Huffman】Fence Repair(POJ 3253)