poj3253 Fence Repair【优先队列】
2014-09-23 19:21
218 查看
大意:
需要把一根长木棍锯成一些短木棍
短木棍的长度是告诉你的
每一次锯的花费为要锯的改段的长度
问最小花费
比如n个小木棍长度分别5 8 8
也就是相当于你有一根21的木棍 现在需要把它锯成 上述的三段
每次只能把一个木棍锯成两段
比如21可以锯成13 和 8 但是由于选择的是21 所以花费为21
第二次把13 锯成5和8 花费 为13
总花费为21 + 13 = 34
分析:
其实我们可以逆向思维
想在有n跟木棍现在想要把他们拼成一跟
每一次的花费就是这两段的和
那么我们根据贪心的思想肯定是每次选取的是最小的两段了
用堆或优先队列来写就可以了
代码:
View Code
需要把一根长木棍锯成一些短木棍
短木棍的长度是告诉你的
每一次锯的花费为要锯的改段的长度
问最小花费
比如n个小木棍长度分别5 8 8
也就是相当于你有一根21的木棍 现在需要把它锯成 上述的三段
每次只能把一个木棍锯成两段
比如21可以锯成13 和 8 但是由于选择的是21 所以花费为21
第二次把13 锯成5和8 花费 为13
总花费为21 + 13 = 34
分析:
其实我们可以逆向思维
想在有n跟木棍现在想要把他们拼成一跟
每一次的花费就是这两段的和
那么我们根据贪心的思想肯定是每次选取的是最小的两段了
用堆或优先队列来写就可以了
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn = 20005; priority_queue<int, vector<int>, greater<int> > q; int main() { int n; int num; while(EOF != scanf("%d",&n) ) { while(!q.empty() ) q.pop(); for(int i = 1; i <= n; i++) { scanf("%d",&num); q.push(num); } long long ans = 0; while(q.size() >= 2) { int x1 = q.top(); q.pop(); int x2 = q.top(); q.pop(); ans += x1 + x2; q.push(x1 + x2); } printf("%I64d\n",ans); } return 0; }
View Code
相关文章推荐
- POJ3253 Fence Repair【哈夫曼树+优先队列】
- POJ3253《Fence Repair》方法:优先队列
- POJ3253 Fence Repair (二叉堆 | 优先队列 | huffman树 )
- POJ3253 Fence Repair (二叉堆 | 优先队列 | huffman树 )
- poj3253 Fence Repair【优先队列】
- POJ3253 Fence Repair (二叉堆 | 优先队列 | huffman树 )
- poj3253 Fence Repair 优先队列,C++STL中priority_queue的使用
- 【Huffman树贪心+优先队列】POJ3253-Fence Repair
- 【POJ 3253 Fence Repair】+ 优先队列
- POJ 3253 Fence Repair 堆的应用,优先队列
- 优先队列啦-POJ3253
- POJ 题目3253 Fence Repair(优先队列,哈弗曼)
- POJ 3253 优先队列 Fence Repair
- POJ 3253 Fence Repair 题解(优先队列实现哈夫曼树)
- 20140822 【 优先队列 】 POJ 3253 Fence Repair
- Fence Repair 【优先队列】
- poj3253(优先队列 哈夫曼树)
- POJ 3253 优先队列 Fence Repair
- POJ3253---切木板(优先队列,贪心)
- poj 3253 Fence Repair之优先队列解法