讨论 / 河滨国资pascal AC题解
图灵 2016-11-14 21:43:13
点我顶贴 收藏 删除
var n,i,s,sum:longint;

a:array[-2..10009] of longint;

procedure up(son:longint); //将数读入堆中

var t:longint;

begin

while (son<>1) and(a[son div 2]>a[son]) do

begin

t:=a[son div 2];

a[son div 2]:=a[son];

a[son]:=t;

son:=son div 2;

end;

end;

procedure down(h:longint); //将数取出堆,将最大的一个放在根节点,进行排序。

var fa,son,t:longint;

begin

fa:=h;

while (fa*2<=n)or (fa*2<=n) do

begin

if (fa*2+1>n) or(a[fa*2]<a[fa*2+1])

then son:=fa*2

else son:=fa*2+1;

if a[fa]>a[son]

then

begin

t:=a[fa];

a[fa]:=a[son];

a[son]:=t;

fa:=son;

end

else break;

end;

end;

begin

sum:=0;

readln(n);

read(a[1]);

for i:=2 to n do

begin

read(a[i]);

up(i);

end;

while n>1 do //取数

begin

s:=0;

s:=a[1];

a[1]:=a[n];

n:=n-1;

down(1); //取一个数排一次。

s:=s+a[1];

a[1]:=a[n];

n:=n-1;

down(1);

n:=n+1;

a[n]:=s;

sum:=sum+s; //保存消耗的体力

up(n);

end;

write(sum);

end.

查看更多回复
提交回复