首页 > [NOIP2004]合并果子
头像 savage
发表于 2019-09-07 12:03:47
算法知识点: 贪心,哈夫曼树,堆,优先队列 复杂度: 解题思路: 经典哈夫曼树的模型,每次合并重量最小的两堆果子即可。 C++ 代码: #include <iostream> #include <algorithm> #in 展开全文
头像 savage
发表于 2019-08-29 22:42:26
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只 展开全文
头像 小嗷犬
发表于 2023-08-18 22:46:17
考察知识点:贪心、优先队列、哈夫曼树 题目翻译一下就是 个节点构成一棵二叉树,求这棵树的最小带权路径长度。 哈夫曼树 是带权路径长度最小的树,所以本题只需要构造一棵哈夫曼树即可。 时间复杂度: #include <bits/stdc++.h> using namespace std; 展开全文
头像 威风镰鼬
发表于 2021-07-06 18:25:18
思路 贪心正解。用优先队列,每次把最小的两个果子合并了,得到的是最优解。 代码 #include<bits/stdc++.h> using namespace std; priority_queue<int,vector<int> , greater<int&g 展开全文
头像 expect2004
发表于 2019-08-30 21:56:40
显然每次选取两堆重量最小的最好。 主要要介绍的不是这个解法,而是几个奇奇怪怪的东西。 Heap STL中常用的堆是priority_queue(优先队列),但是STL同样支持一个奇怪的东西为heap heap有几个函数:make_heap,pop_heap,push_heap 具体用法右转百度 展开全文
头像 zhangjitong
发表于 2024-10-04 21:00:40
直接上AC代码 #include<bits/stdc++.h> using namespace std; priority_queue<int,vector<int>,greater<int>>q; int n,ans; int main(){ 展开全文
头像 sunny_forever
发表于 2021-08-04 20:58:26
每次合并最轻的两堆 Code #include <bits/stdc++.h> using namespace std; const int N = 10010; typedef long long ll; priority_queue<int,vector<int& 展开全文
头像 xc01
发表于 2025-08-25 14:48:18
思路:因为每次只能将两堆合并成一堆(堆数-1),所以合并次数一定是n-1次.那么只要让每次合并消耗的体力值最小即可(永远选择最小的两堆).刚好符合最小堆优先队列 PS:注意stl中的优先队列默认是最大堆,不像sort()默认从小到大排序.想要最小堆,就要使用greater<>,并且在中间 展开全文
头像 Infinite_Light
发表于 2024-12-21 18:43:22
链接:https://ac.nowcoder.com/acm/problem/16663 来源:牛客网 题目描述     每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果 展开全文
头像 DearAlice
发表于 2024-03-07 21:34:28
采用数组模拟,思想类似于插入排序。 import java.util.Scanner; public class NC16663 { public static void main(String[] args) { Scanner sc = new Scanner(Syst 展开全文