Advertisement

7-1 修理牧场 (25 分)(C语言实现)

阅读量:

修理牧场 (25 分)

农民要在牧场围栏的一处进行修复工作,并对这一区域进行测量。他确定所需木材数量为N块,并根据测量结果确定每块木材的具体长度L_i(i=1,2,...,n)。随后他购买了一根足够长且可分割成N段的木材(其总长度等于所有L_i之和)。然而由于没有自行切割工具(即没有锯子),因此请他人切割时支付的费用与其所处理木材长度成正比(假设费用直接与所处理木材长度相等)。例如将一根长为20单位的木材分割为8、7和5单位三段时第一次花费20单位第二次花费15单位总共花费35单位而如果第一次将木材分割为15和5则第二次花费12单位导致总费用上升至32单位明显高于前者)

输入格式:

随后提供一个具体的数值案例:给定一个不超过10^4的自然数N(记作N \leq 10^4),其目的是指示将木材分割为N段。接着,在下一行呈现具体的数值信息:共计N个不大于50的自然数a_1, a_2, \dots, a_N(每个a_i \leq 50),它们分别代表各个分割段的具体长度。

输出格式:

输出一个整数,即将木头锯成N块的最少花费。

输入样例:

8
4 5 1 2 1 3 1 1

输出样例:

49

代码实现

复制代码
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct HNode * Heap; /*堆结构*/ 
    struct HNode{
    	int * Data;
    	int Size;
    };
    typedef Heap MinHeap;/*最小堆*/ 
    Heap CreateHeap(int n)//最小堆的创建 
    {
    	MinHeap H=(MinHeap)malloc(sizeof(struct HNode));
    	H->Data=(int *)malloc((n+1)*sizeof(int));
    	H->Size=0;
    	H->Data[0]=-1;/*最小堆的哨兵*/ 
    	
    	return H; 
    }
    void Insert(Heap H,int m)//最小堆的插入 
    {
    	int i;
    	
    	i=++H->Size ;
    	for(;H->Data[i/2]>m;i/=2){
    		H->Data [i]=H->Data [i/2];
    	}
    	H->Data [i]=m;
    }
    
    int Del(Heap H)//最小堆的删除 
    {
    	int parent,child;
    	int min,x;
    	
    	min=H->Data [1];
    	x=H->Data [H->Size --];
    	
    	for(parent=1;parent*2<=H->Size ;parent=child){
    		child=parent*2;
    		if((child!=H->Size )&&(H->Data [child]>H->Data [child+1])) child++;
    		
    		if(H->Data [child]>=x) break;
    		else H->Data [parent]=H->Data [child];
    	}
    	H->Data [parent]=x;
    	
    	return min;
    }
    	
    int main(){
    	int n,m,i,sum=0,a,b;
    	scanf("%d",&n);
    	Heap H=CreateHeap(n);
    	
    	for(i=1;i<=n;i++){
    		scanf("%d",&m);
    		Insert(H,m);/*将所有元素入堆(H)*/ 
    	}
    	while(H->Size!=1){
    		a=Del(H);
    		b=Del(H);
    		b=a+b;
    		sum+=b;
    		Insert(H,b);
    	}
    	printf("%d",sum);
    } 
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

全部评论 (0)

还没有任何评论哟~