题目:农夫约翰要修补围墙,他有一块很长的木板,要把木板锯成N块木板,所锯木板的长度就是花费,问如何花费最小。比若8 8 5,总长度是21,所以第一次锯要花费21,木块据成8 13,然后13锯成8 5,花费13,总花费为13+21=34.令一种锯法是分成16 5,再分成8 8,但这样的花费是16+21=37。求花费最小就是用huffman思想,用优先队列做。
#include <queue>#include <iostream>using namespace std;int main(){ int n,num; long long res = 0; int a,b; cin >> n; PRiority_queue<int,vector<int>,greater<int> > que; for(int i = 0; i < n; ++i) { cin >> num; que.push(num); } while(que.size() != 1) { a = que.top(); que.pop(); b = que.top(); que.pop(); res += (a+b); que.push(a+b); } cout << res << endl; return 0;}新闻热点
疑难解答