首页 > 试题广场 >

[NOIP2004]合并果子

[编程题][NOIP2004]合并果子
  • 热度指数:1053 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

    每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

    因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有3种果子,数目依次为129。可以先将12堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

输入描述:
输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。 


输出描述:
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
示例1

输入

3
1 2 9

输出

15

备注:
对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。
头像 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 展开全文

问题信息

难度:
1条回答 4377浏览

热门推荐

通过挑战的用户

[NOIP2004]合并果子