标签:农夫 iostream space log ++ 输入 技术 turn pop
农夫约翰为了修理栅栏,要将一块很长的木板切割成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)
标签:农夫 iostream space log ++ 输入 技术 turn pop
原文地址:http://www.cnblogs.com/LuRenJiang/p/7168293.html