poj3253(优先队列)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int N,R;
int x[50100];

int main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>N)
    {
        priority_queue<int,vector<int>,greater<int> > P;

        for(int i = 0; i < N; i++)
        {
            cin>>x[i];
            P.push(x[i]);
        }

        long long  ans = 0;
        while(P.size() > 1)
        {
            int L1 = P.top();P.pop();
            int L2 = P.top();P.pop();
            ans += L1+L2;
            P.push(L1+L2);
        }
        cout<<ans<<endl;
    }
    return 0;
}

时间: 2024-08-26 20:54:17

poj3253(优先队列)的相关文章

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

poj3253 Fence Repair【优先队列】

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

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

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)

优先队列啦-POJ3253

ence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 28008   Accepted: 9098 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) p

poj3253哈夫曼树

Fence Repair Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Farmer John wants to repair a small length of the fence around the pasture. He measures the

POJ3253 Fence Repair 小顶堆+贪心

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

POJ-3253 Fence Repair---Huffman贪心

题目链接: https://vjudge.net/problem/POJ-3253 题目大意: 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度 给定各个要求的小木板的长度,及小木板的个数n,求最小费用 思路: HUffman算法 优先队列 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring>

51nod1428(优先队列)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 题意:中文题诶- 思路:贪心 问最少要多少教室就是求最多有多少个时间段产生了交集咯.我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列. 接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值.对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加