合并石子
[ 问题描述 ]
今天课间的时候,小明同学在学校的操场上发现了 n 堆大小不一的小石子,小明决定将 它们合并成一堆 , 但现在小明思考着这样一个问题:如何消耗最少的体力,把这 n堆小石子合并成一堆?现已知合并所消耗的体力等于每次合并两堆小石子的重量之和 , 每次合并,他会把其中的两堆小右子合并到一起, n堆小石子经过 n-ii 合并之后就只剩一堆了。
比如,n=3时表示共有 3 堆每堆重量分别是么 2、1、9。一种合并方案是 2 和 9 合并,新堆重量是 11,耗费体力为 11;接着 11 与 1 合并新堆重量是 12,耗费体力为 12, 因此总消耗体力是 11+12=23。另一种方案是 12,新堆重量是 3,耗费体力为 3, 接着 3 和 9 合并,新堆重量是 12,耗费体力为 12,因此总消耗体力是 3+12=15。可以证明 这样合并就是最少耗费体 3 的方法。
var i, sum, n: integer;
a:array[1..100]of integer;
procedure sort(x:integer);
var i, j, temp: integer ;
begin
for i:= x to n-1 do
for j:=n downto i+1 do
if a[j]<a[j-1] then
begin
temp:=a[j]; a[j] :=a[j-1]; a[j-1] :=temp;
end ;
end;
begin
readln(n);
for i:=1 to n do read (a[i]);
sum:=0;
sort(1);
for i:=1 to n-1 do
begin
a[i+1]:=a[i]+a[i+1];
sum:= sum+a[i+1] ;
sort(i+1) ;
end ;
writeln(sum);
end.