中南大学复试C语言上机题——捡石子

来源:互联网 发布:淘宝答题红包 编辑:程序博客网 时间:2024/05/19 12:17

题目描述

在一个圆形操场的四周摆放着 n堆石子。 现要将石子有次序地合并成一堆。 规定每次选2 堆石子合并成新的一堆,合并的费用为新的一堆石子数。试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用。

输入

输入数据第1行有1个正整数 n(1≤n≤1000),表示有 n堆石子,每次选2堆石子合并。第2行有 n个整数, 分别表示每堆石子的个数(每堆石子的取值范围为[1,1000]) 。

输出

数据输出为一行, 表示对应输入的最小总费用。

样例输入

745 13 12 16 9 5 22

样例输出

313

代码

#include<stdio.h>int n = 0 ;int main(){int arry[20],i=0;int sumCost(int arry[],int n ) ; int findMinSum(int arr[]) ;int cost =0 ;printf("请输入堆的个数");scanf("%d",&n) ;printf("请依次输入每个堆") ;for(i;i<n;i++) scanf("%d",&arry[i]) ; cost = sumCost(arry,n);printf("最小花费为:%d",cost) ;}int sumCost(int arr[],int n){     int sum = 0 ;     int x =0;    int costsum = 0 ;    int costArr[20] ;     while(x<n-1)    {        sum+=findMinSum(arr) ;            x++ ;    }    return sum ; }int findMinSum(int arr[]){        int i=0,j=0,min=0,recordi=0;      int minNum[2]  ;    int sum = 0 ;    if(n<=2)    {        return arr[0]+arr[1] ;    }else    {        while(j<2)        {            min=100000;            for(i=0;i<n;i++)            {                if(arr[i]<min && arr[i]!=-1)                {   min=arr[i] ;                //  printf("-----%d min",arr[i]) ;                    minNum[j] = arr[i] ;                    recordi = i ;                 }            }             j++;             arr[recordi]= -1 ;        }        arr[recordi] = minNum[0]+minNum[1] ;    }    return minNum[0]+minNum[1] ;}
0 0