合并果子(堆写法)

原创 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);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Tyvj 1066 合并果子(贪心)

时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第二道 描述     在一个果园里,多多已经将所...
  • shao824714565
  • shao824714565
  • 2016年08月11日 17:43
  • 3952

合并果子

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

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

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

作业-合并果子(fruit)

题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。 多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。...
  • dogeding
  • dogeding
  • 2016年10月03日 12:13
  • 147

P1097合并果子解题报告

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

合并果子

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

Vijos-P1097-合并果子(简单贪心 && 优先队列 && c++)

P1097合并果子 Accepted 标签:贪心NOIP提高组2004 描述 在一个果园里,多多已经将所有的果子打了下来,而且按...
  • qq_16542775
  • qq_16542775
  • 2015年05月12日 16:06
  • 1157

noip2004 合并果子 (贪心+小根堆)

P1097合并果子 Accepted 标签:贪心NOIP提高组2004 描述 在一个果园里,多多已经将所有的果子打了下来,而...
  • yuyanggo
  • yuyanggo
  • 2015年08月31日 17:07
  • 648

合并果子,浅谈堆

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

合并果子(STL堆排序)

合并果子来源: 2004年NOIP全国联赛普及组 题目描述: 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可...
  • cax1165
  • cax1165
  • 2016年09月24日 15:30
  • 359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:合并果子(堆写法)
举报原因:
原因补充:

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