poj 3253 贪心+优先队列【哈夫曼思想】

题目链接

题目大意:

大意:需要把一根长木棍锯成一些短木棍短木棍的长度是告诉你的每一次锯的花费为要锯的改段的长度问最小花费比如n个小木棍长度分别5 8 8
也就是相当于你有一根21的木棍 现在需要把它锯成 上述的三段每次只能把一个木棍锯成两段比如21可以锯成13 和 8 但是由于选择的是21 所以花费为21
第二次把13 锯成5和8 花费 为13总花费为21 + 13 = 34

分析:其实我们可以逆向思维想在有n跟木棍现在想要把他们拼成一跟每一次的花费就是这两段的和那么我们根据贪心的思想肯定是每次选取的是最小的两段了
用堆或优先队列来写就可以了

#include <cstdio>
#include <queue>
#include <vector>
#include <functional>     //用greater时,要加上这个头文件
#include <iostream>
using namespace std;
int main()
{
    int n;//需要切割的木板个数
    __int64 temp, a, b, mincost;
    while (~scanf("%d", &n))
    {
        //定义从小到大的优先队列,可将greater改为less,即为从大到小
        priority_queue<int, vector<int>, greater<int> > Q;

        while (!Q.empty())//清空队列
            Q.pop();

        for (int i = 1; i <= n; i++)
        {
            scanf("%I64d", &temp);
            Q.push(temp);//输入要求的木板长度(费用)并入队
        }

        mincost = 0;//最小费用初始为零  

        while (Q.size() > 1)//当队列中小于等于一个元素时跳出
        {
            a = Q.top();//得到队首元素的值,并使其出队
            Q.pop();
            b = Q.top();//两次取队首,即得到最小的两个值
            Q.pop();
            Q.push(a + b);//把两个最小元素的和入队
            mincost += a + b;
        }
        if (n == 1)mincost = temp;
        printf("%I64d\n", mincost);
    }
    return 0;
}

2018-04-01

原文地址:https://www.cnblogs.com/00isok/p/8687915.html

时间: 2024-10-08 17:02:19

poj 3253 贪心+优先队列【哈夫曼思想】的相关文章

poj 3253 Fence Repair(优先队列+哈夫曼树)

题目地址:POJ 3253 哈夫曼树的结构就是一个二叉树,每一个父节点都是两个子节点的和.这个题就是可以从子节点向根节点推. 每次选择两个最小的进行合并.将合并后的值继续加进优先队列中.直至还剩下一个元素为止. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <cty

[ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25274   Accepted: 8131 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)

贪心算法-霍夫曼编码

霍夫曼编码是一种无损数据压缩算法.在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度.期望值降低,从而达到无损压缩数据的目的.例如,在英文中,e的出现机率最高,而z的出现概率则最低.当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26).用普通的表示方法时,每个

贪心(哈夫曼树):HDU 5884 sort

这道题目,我做的时候不会哈夫曼树,自己贪心是错的都不知晓.还可以发现这里不必用优先队列,可以用两个队列,毕竟插入的数是有单调性的. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int N=300010; 7 int a[N],n,S,f1,f2,b1,b2; 8 int

POJ 1862 Stripies【哈夫曼/贪心/优先队列】

Stripies Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18198   Accepted: 8175 Description Our chemical biologists have invented a new very useful form of life called stripies (in fact, they were first called in Russian - polosatiki, bu

poj 3253 Fence Repair 【哈弗曼树】+【优先队列】

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27742   Accepted: 9019 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 3190 贪心 + 优先队列

题意:一群牛,每头牛有固定的时间[a,b]让农夫去挤牛奶,农夫也只能在对应区间对指定奶牛进行挤奶, 求最少要多少个奶牛棚,在每个棚内的奶牛的挤奶时间不冲突. 算法:1.第一个想法就是贪心,对每头牛的挤奶时间[a,b]按a和b都从小排序,接着从左边开始找地一头牛, 然后再往右边找能够不冲突的牛再一个奶牛棚内.这个算法事件复杂度为n*n,由于最多5000头牛 所以后面还是TLE了. 2.还是自己太弱了,原来可以用优先队列进行优化,可以把当前冲突的牛放入优先队列,然后每次都能够冲优先队列 里面取出a最

Sunscreen (poj 3614 贪心+优先队列)

Language: Default Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4499   Accepted: 1565 Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at th

Stall Reservations(POJ 3190 贪心+优先队列)

Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 1588   Special Judge Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time in