您的位置:首页 > Web前端

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跟木棍现在想要把他们拼成一跟

每一次的花费就是这两段的和

那么我们根据贪心的思想肯定是每次选取的是最小的两段了

用堆或优先队列来写就可以了

代码:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: