首页 > 编程语言 >【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)

【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)

时间:2023-09-24 13:31:52浏览次数:69  
标签:Repair pq 木板 哈夫曼 队列 题解 长度 农夫 21

农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。 FJ伤心地意识到他没有锯木头的锯子,于是他拿着这块长木板来到农夫唐的农场,礼貌地问他是否可以借一把锯子。 农夫唐是一位秘密资本家,他不借给FJ一把锯子,而是提议向农夫约翰收取N-1块木板的每一块费用。切割一块木头的费用正好等于它的长度。切割长度为21的木板需要21美分。 农夫唐然后让农夫约翰决定切割木板的顺序和位置。帮助农夫约翰确定他可以花多少钱来制作N块木板。FJ知道,他可以按照不同的顺序切割木板,这将导致不同的费用,因为产生的中间木板长度不同。

输入 第1行:一个整数N,木板的数量 第2..N+1行:每行包含一个整数,描述所需木板的长度 输出 第1行:一个整数:他必须花费N-1次削减的最低金额

Sample Input 3 8 5 8 Output 34

暗示 他想把一块长度为21的木板切成长度为8、5和8的几块。 原始板的尺寸为8+5+8=21。第一次切割将花费21美元,应用于将板材切割成尺寸为13和8的块。第二次切割将花费13,并且应该用于将13切割成8和5。这将花费21+13=34。如果将21号切割成16号和5号,第二次切割将花费16号,总共37号(超过34号)。

思路

将所需木板长度放入最小值优先的优先队列。如果优先队列只有一个元素,则队头为总费用。如果优先队列的元素个数大于1,则让优先队列的两个元素出队,求和后加到总费用中,再将和入队,重复直到优先队列只剩下一个元素,输出总费用。

AC代码

#include <iostream>
#include <queue>
#define AUTHOR "HEX9CF"
using namespace std;

int n;
long long cost = 0;
priority_queue<int, vector<int>, greater<int>> pq;

int main()
{
    cin >> n;
    while (n--)
    {
        int in;
        cin >> in;
        pq.push(in);
    }
    if(1 == pq.size()){
        cost += pq.top();
    }
    while (pq.size() > 1)
    {
        int a, b;
        a = pq.top();
        pq.pop();
        b = pq.top();
        pq.pop();
        cost += (a + b);
        pq.push(a + b);
    }
    // cout << pq.top() << endl;
    cout << cost << endl;
    return 0;
}

标签:Repair,pq,木板,哈夫曼,队列,题解,长度,农夫,21
From: https://blog.51cto.com/HEX9CF/7585603

相关文章

  • S16.23.12.2. 集合论 题解
    原题连接可以发现集合对称差就是异或运算。每个点都记一个长度为值域的bitset,每一位都表示根到他有没有奇数个这个数字。那么\(a_x\)改为\(v\)的修改就变成了修改子树的所有点的bitset,每次将子树中所有点的第\(a_x\)位取反,再将第\(v\)位取反。查询就是\(u\)的\(b......
  • springBoot上传文件时MultipartFile报空问题解决方法
    1.问题描述:之前用springMVC,转成springboot之后发现上传不能用。网上参考说是springboot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。2.解决方法加入配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context......
  • AT_abc321_f [ABC321F] #(subset sum = K) with Add and Erase 题解
    AT_abc321_f[ABC321F]#(subsetsum=K)withAddandErase题解题目大意现在有一个空箱子。给你两个数\(Q,K\),然后给你\(Q\)行,每一行代表一个操作:\(+x\),即向箱子里加一个权值为\(x\)的小球。\(-x\),即从箱子里把权值为\(x\)的小球拿一个出来。保证合法,即箱子......
  • CF877F 题解
    CF877F题解更好的阅读体验提供一个扫描线+根号分治做法。首先,可以把题目的条件转化成求$sum_r-sum_{l-1}=k$的区间数。考虑扫描线,当区间的右端点从$r-1$移动到$r$时,新增的区间的左端点就是所有满足$sum_{l-1}=sum_r-k,l\ler$的$l$。这时我们对$sum_{l-1}$......
  • 【问题解决】shell脚本执行错误 $‘\r‘:command not found
    问题原因:在Windows中,换行符是由回车符(\r)和换行符(\n)组成的,而在Unix/Linux等系统中,只使用换行符(\n)作为换行标志。当你在Unix/Linux系统上运行一个包含Windows格式换行符的脚本时,Shell会尝试解释其中的回车符,导致错误提示$‘\r’:commandnotfound。这是因为Shell将回......
  • [COCI2016-2017#4] Osmosmjerka 题解
    [COCI2016-2017#4]Osmosmjerka题解我们发现对于每个点,只有八个方向,也就是说,最终能得到的字符串只会有\(8nm\)个,那我们可以考虑把这些字符串的哈希值求出来,相同的哈希值代表选到相同字符串的一种可能,直接统计即可。现在的问题就在于,怎么快速地求出这\(8nm\)个字符串的哈希......
  • 题解 CF1257G【Divisor Set】
    problem我们说一个集合\(D\)是一个好的集合,当不存在集合中的两个不同元素\(a,b\)使得\(a\)是\(b\)的约数。给定一个超大整数的素数表示形式\(N=\prod_{i=1}^n{p_i}\),要求从它的所有因子中选择尽可能多的元素组成一个好的集合。问这个最大的size是多少,输出模99824......
  • 题解 ARC165F【Make Adjacent】
    区间排序问题,主席树优化建图,最小字典序拓扑排序(priority_queue)problem给定一个长度为\(n*2\)的序列,其中每种元素恰好出现了2次。允许每次选择任意两个相邻的元素交换。那么必定存在一个最小\(k\):使得\(k\)次交换以后所有相同的元素都是相邻的。问恰好操作\(k\)次后,......
  • 【POJ 1521】Entropy 题解(贪心算法+优先队列+哈夫曼树)
    熵编码器是一种数据编码方法,通过对删除了“浪费”或“额外”信息的消息进行编码来实现无损数据压缩。换句话说,熵编码去除了最初不需要的信息,以准确编码消息。高度的熵意味着一条消息包含大量浪费的信息;以ASCII编码的英文文本是具有极高熵的消息类型的示例。已经压缩的消息,如JPEG图......
  • 题解 CF1873H Mad City
    题意描述马塞尔和瓦勒里乌(Valeriu)所在的疯狂城市由\(n\)栋建筑和\(n\)条双向道路组成。马塞尔和瓦勒里乌(Valeriu)分别从\(a\)号和\(b\)号建筑开始。马塞尔想赶上瓦勒里乌(换句话说,与他在同一栋楼里或在同一条路上相遇)。在每次移动过程中,他们都会选择前往当前建筑的邻近建......