代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int min, N, location, n[100] = { 0 }, sum_array[100] = { 0 }, temp[100] = { 0 };
int i, j, k, sum, count;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%d", &n[i]);
}
j = 0;
sum = 0;
count = 0;
//每次循环寻找最小值,并计算、替换
while (N!=1)
{
//求相邻和
for (i = 0; i < N-1; i++)
{
sum_array[i] = n[i] + n[i + 1];
}
//找最小和
min = sum_array[0];
location = 0;
for (i = 1; i < N - 1; i++)
{
if (sum_array[i] < min)
{
min = sum_array[i];
location = i;
}
}
//存放最小和
temp[j++] = min;
count++;
//木棍数组中替换最小值,并删去已计算的元素
n[location] = min;
for (i = location + 1; i < N; i++)
{
n[i] = n[i + 1];
}
N--;
}
for (i = 0; i < count; i++)
{
sum = sum + temp[i];
}
printf("%d", sum);
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
思路如下:
循环执行
1.计算每个木棍(除了最后一个)与下一个木棍(n[i]+n[i+1])的长度和
2.找出这些和的最小值
3.最小值存入待累计数组
4.将这个最小值放回原来的位置(i)并删去后一个计算数(n[i+1])
这样每次就能得到所有木棍中最小的两个木棍相加时间,最后累加即可。
以simple input和output为例: