【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;
}

 

posted @ 2017-07-14 08:41  路人姜。  阅读(122)  评论(0编辑  收藏  举报