POJ3253 Fence Repair(贪心)

切割木板的顺序是自由的,所以每次选择两块最短的板,组合在一起,加入队列,原来两个板出队,直到队列中为空或者只剩下一个板时结束。这里使用优先队列较为方便。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll __int64
using namespace std;

int len[20005];

int main()
{
    //freopen("d:\\test.txt","r",stdin);
    int n;
    ll ans=0;
    cin>>n;
    priority_queue<int,vector<int>,greater<int> >q;//最小元素在队头
    for(int i=0;i<n;i++)
    {
        cin>>len[i];
        q.push(len[i]);
    }
    while(!q.empty())
    {
        int t1=q.top();
        q.pop();
        if(!q.empty())
        {
            int t2=q.top();
            q.pop();
            ans+=t1+t2;
            q.push(t1+t2);
        }
        else break;
    }
    printf("%I64d\n",ans);
    return 0;
}
时间: 2024-10-12 19:56:15

POJ3253 Fence Repair(贪心)的相关文章

POJ3253 Fence Repair 小顶堆+贪心

给了你N个木棒,求把他们组装成一根需要的最小花费,每次只能选两根组装在一起,需要的花费为两个木棒之和, 以前遇到过把一整根切开的,那个是DP,这个则有些类似,可是大胆的猜测了一下,直接每次选取所有木棒中最短的两根,这样就可以了,那么贪心是适用的,但是数量很多,而且两根最短的组装好了得插回去,这样不可能每次都排序吧, 这题首先优先队列肯定是可以做的, 最小堆也是可以的,每次都选出堆里的最小的两个求和再放回去即可 队列本身也就是堆吧,所以差别不大,但是没用过最小堆最大堆的 所以用一次把 #inclu

poj3253 Fence Repair STL优先队列

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://poj.org/problem?id=3253 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each

POJ 3253 Fence Repair 贪心 优先级队列

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77001   Accepted: 25185 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

优先队列 poj3253 Fence Repair

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 51411   Accepted: 16879 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

poj-3253 Fence Repair[霍夫曼树]

Fence Repair Time Limit: 2000MS Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,0

[POJ3253] Fence Repair

Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a s

poj3253 Fence Repair【哈夫曼树+优先队列】

Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a s

POJ - 3253 Fence Repair(贪心)

题目链接:http://poj.org/problem?id=3253 题意:哈夫曼最优编码 贪心策略:尽可能让花费大的路径短. 总花费=每个花费*路径之和.也等于每次加上去得到的数之和.(每次都排序一下,把最小的两个相加) 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 typedef long long LL; 6 const int maxn=20000+10; 7 int L[m

poj3253 Fence Repair【优先队列】

大意: 需要把一根长木棍锯成一些短木棍 短木棍的长度是告诉你的 每一次锯的花费为要锯的改段的长度 问最小花费 比如n个小木棍长度分别5 8 8 也就是相当于你有一根21的木棍  现在需要把它锯成 上述的三段 每次只能把一个木棍锯成两段 比如21可以锯成13 和 8   但是由于选择的是21  所以花费为21 第二次把13 锯成5和8  花费 为13 总花费为21 + 13 = 34 分析: 其实我们可以逆向思维 想在有n跟木棍现在想要把他们拼成一跟 每一次的花费就是这两段的和 那么我们根据贪心的