讨论 / 看不懂 堆排解决
习新果 2013-02-02 01:20:00
点我顶贴 收藏 删除
var a:array[0..20000] of longint;

i,j,n,ed,sum,t:longint;

procedure heapdown(i,n:longint);

var

j,t:longint;

begin

j:=i*2;

while j<=n do

begin

if (j<n) and (a[j+1]<a[j]) then inc(j);

if a[i]>a[j] then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

i:=j;

j:=i*2;

end

else j:=maxlongint;

end;

end;

begin

readln(n);

for i:=1 to n do read(a[i]);

for i:=n div 2 downto 1 do heapdown(i,n);

sum:=0;

while n<>1 do

begin

t:=a[n];a[n]:=a[1];a[1]:=t;

heapdown(1,n-1);

dec(n);

t:=a[n];a[n]:=a[1];a[1]:=t;

heapdown(1,n-1);

a[n]:=a[n]+a[n+1];

sum:=sum+a[n];

end;

writeln(sum);

end.

查看更多回复
提交回复