合并果子(堆写法)

原创 2016年05月30日 10:52:03

题目大意:

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

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

# 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>1&&a[r]<a[r/2]){ 
            h=a[r];
            a[r]=a[r/2];
            a[r/2]=h;
            r/=2;
        }
    }
    int len=n;
    for(i=1;i<n;i++){
        sum=a[1];//将当前最小的放到本次合并中
        a[1]=a[len];
        len--;
        r=1;//下沉
        while((r*2<=len&&a[r]>a[r*2])||(r*2+1<=len&&a[r]>a[r*2+1])){
            j=r*2;
            if(j+1<=len&&a[j]>a[j+1])j++;
            h=a[r];
            a[r]=a[j];
            a[j]=h;
            r=j;
        }
        sum+=a[1];//将第二小的加入本次合并中
        a[1]=a[len];
        len--;
        r=1;//下沉
        while((r*2<=len&&a[r]>a[r*2])||(r*2+1<=len&&a[r]>a[r*2+1])){
            j=r*2;
            if(j+1<=len&&a[j]>a[j+1])j++;
            h=a[r];
            a[r]=a[j];
            a[j]=h;
            r=j;
        }
        ans+=sum;//合并
        a[++len]=sum;
        r=len;//上浮
        while(r>1&&a[r]<a[r/2]){
            h=a[r];
            a[r]=a[r/2];
            a[r/2]=h;
            r/=2;
        }
    }
    printf("%I64d\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【二叉树】 堆应用:合并果子

合并果子(fruit) 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。  多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一...

合并果子,浅谈堆

合并果子是一道经典的贪心,但是如果一味的快拍,那么: (n-1)*log(n)*n的复杂度不卡才怪,这个时候,我们就要请出二叉树中的堆。 堆,是一棵完全二叉树,如果你想要插入或删除一个元素,并保持...

P1097合并果子解题报告

Name: P1097合并果子   Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和出处  Author: goal00001111  Date: 11-12...

合并果子

题目大意是:有n堆果子,每堆果子的重量分别是:a[1],a[2],...,a[n]。每一次合并,可以把两堆果子合并到一起,直到合并为一堆,每次消耗的体力等于两堆果子的重量之和。在合并果子时总共消耗的体...

Tyvj 1066 合并果子(贪心)

时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第二道 描述     在一个果园里,多多已经将所...

合并果子

合并果子 成绩 10 开启时间 2013年03月19日 星期二 14:40 折扣 0.8 折扣时间 2013年03月28日 星期...
  • y11201
  • y11201
  • 2013-06-18 12:18
  • 3655

【NOIP2004提高组】合并果子(贪心)

【问题描述】   在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。   每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子...

对于合并果子一题方法的研究。

Noip2004年提高组——合并果子这道题目,还是比较水的,用一般的方法都能过,但是如果数据大一点的话就不太好办了。 先说最普通的方法: 贪心+快排 也就是每做完一次贪心就快排然后取前两个的最小值...

【经典题目】& 合并吧!石子合并 与 合并果子 &

这是两个不同的题目,来自两场不同的比赛,用了两种不同的算法,会出两个不同的答案。明明如此相像的题目,却又为何产生相差甚大的结果呢?不要着急,让我们缓缓揭开历史的纱幕,深度地去解析题目,除去笼罩着的迷雾...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)