【Huffman】Fence Repair(POJ 3253)
阿新 • • 發佈:2017-07-14
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)