HuffmanFence Repair(POJ 3253)
Posted 路人姜。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HuffmanFence 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; }
以上是关于HuffmanFence Repair(POJ 3253)的主要内容,如果未能解决你的问题,请参考以下文章