C语言 合并果子问题

Python015

C语言 合并果子问题,第1张

其他都写得不错 但是算法出了点问题

正确的顺序应该是:排序-最小两项相加-排序-最小的两项相加-排序-最小的两项相加-排序-最小的两项相加..........

而不是:排序-最小的两项相加-依次往后相加-........

给你一段我写的

#include <stdio.h>

#define N 100

int count[N]

int main()

{

    int kind,i

    double sum=0

    void compare(int m)

    scanf("%d",&kind)

    for(i=0i<kindi++)

        scanf("%d",&count[i])

    for(i=0i<kind-1i++)

    {

        compare(kind)

        sum+=count[0]+count[1]

        count[0]=sum

        count[1]=count[kind-1]+1

        

    }

    printf("%lf",sum)

    return 0

}

void compare(int m)

{

    int i,j

    for(i=0i<m-1i++)

        for(j=ij<m-i-1j++)

            if(count[j]>count[j+1])

            {

                count[j]=count[j]+count[j+1]

                count[j+1]=count[j]-count[j+1]

                count[j]=count[j]-count[j+1]

            }

}

#include<stdio.h>

int a[10001],b[10001],h1=1,h2=1,t1=1,t2=0,ans=0,num=0

void qs(int left,int right)

{

if(left>=right) return

int i=left,j=right

a[0]=a[left]

while(i<j)

{

while(a[right]>=a[0]&&i<j) j--

if(i<j)a[i]=a[j]

while(a[left]<=a[0]&&i<j) i++

if(i<j) a[j]=a[i]

}

a[i]=a[0]

qs(left,i-1)

qs(i+1,right)

}

int main()

{

int n

FILE *fp

memset(a,5,sizeof(a))

fp=fopen("fruit.in","r")

fscanf(fp,"%d",&n)

int t,i,j

memset(b,5,sizeof(b))

for(t=1t<=nt++)

fscanf(fp,"%d",&a[t])

qs(1,n)

t1=n

h1+=2

t2++

b[t2]=a[1]+a[2]

ans+=b[t2]

while(++num<n-1)

{

if(a[h1+1]<=b[h2]) {b[++t2]=a[h1]+a[h2]ans+=b[t2]h1+=2}

else if(a[h1]>=b[h2+1]) {b[++t2]=b[h2]+b[h2+1]ans+=b[t2]h2+=2}

else {b[++t2]=a[h1++]+b[h2++]ans+=b[t2]}

}

fp=fopen("fruit.out","w")

fprintf(fp,"%d",ans)

fclose(fp)

return 0

}

这段代码恐怕达不到目的。有如下问题,看注释:

for(j=numj>=0j--){ //要改成j>0,因为j从num开始,到1就够数儿了

bubble_sort(a,n)

b[j-1]=a[j-1]+=a[j]//要改成b[j-1]=a[j-2]+=a[j-1],因为j=num开始

n=n-1

}

for(j=numj>=0j--){//改成j=num-1j>0j--。num就越界了,而b[0]还没有赋值,是随机的

total+=b[j]

}

//final=total-temp这句没有必要了

printf("%d",final)//改成printf("%d",total)

}

另:函数bubble_sort改成void型吧,无需返回值,实现中也没有……

以上意见仅供参考……