合并果子(堆写法)

这篇博客探讨了如何解决将多堆果子合并为一堆的问题,以最小化所需的力气。通过利用哈夫曼树的概念,文章重点介绍了采用堆数据结构的解决方案。由于数据规模较大,因此堆的效率在此问题中显得尤为重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

一个小朋友从树上打下了几堆果子。要将所有果子合并成一堆。给出没堆果子的重量求最小力气

本题的思路是要将重量最小的先合并,也就是传说中的哈夫曼树!但本题的数据比较大。今天我们来看堆得写法:

# include<stdio.h>
# include<stdlib.h>
long long a[1000010];
int main(){
    long long sum=0,ans=0,n,i,h,r,j;//本题要用long long不然会答案错误
    scanf("%I64d",&n);
    for(i=1;i<=n;i++){
   
   
        scanf("%I64d",&a[i]);//将重量存入堆
         r=i;//上浮
        while(r&g
题目背景 本题除【数据范围与约定】外与 P1090 完 全 一 致。 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的。多多决定把所有的果子合成一。 每一次合并,多多可以把两果子合并到一起,消耗的体力等于两果子的重量之和。可以看出,所有的果子经过 (n−1)合并之后, 就只剩下一了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有 3 果子,数目依次为 1, 2, 9。可以先将 1、2 合并,新数目为 3,耗费体力为 3。接着,将新与原先的第三合并,又得到新的,数目为 12,耗费体力为 12。所以多多总共耗费体力为 3+12=15。可以证明 15 为最小的体力耗费值。 输入格式 输入的第一行是一个整数 n,代表果子数。 输入的第二行有 n 个用空格隔开的整数,第 i 个整数代表第 i 果子的个数 a i ​ 。 输出格式 输出一行一个整数,表示最小耗费的体力值。 输入输出样例 输入 #1复制 3 1 2 9 输出 #1复制 15 说明/提示 【数据规模与约定】 本题采用多测试点捆绑测试,共有四个子任务。 Subtask 1(10 points):1≤n≤8。 Subtask 2(20 points):1≤n≤10 3 。 Subtask 3(30 points):1≤n≤10 5 。 Subtask 4(40 points):1≤n≤10 7 。 对于全部的测试点,保证 1≤a i ​ ≤10 5 。 【提示】 请注意常数因子对程序效率造成的影响。 请使用类型合适的变量来存储本题的结果。 本题输入规模较大,请注意数据读入对程序效率造成的影响。 用两个队列c++实现代码
最新发布
08-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值