拼多多主营类目选择:求NOIP提高2004合并果子的标程

来源:百度文库 编辑:高考问答 时间:2024/04/28 04:27:17
求pascal程序
贴出来另有分相送。

program fruit;
const
maxn=10000;
type
data=array[1..maxn] of longint;
var
inf,outf:text;
min1,min2,ans:longint;
m,n,i:integer;
tr:data;
procedure init;
var
i:integer;
begin
fillchar(tr,sizeof(tr),0);
ans:=0;
assign(inf,'fruit.in');
assign(outf,'fruit.out');
reset(inf);
readln(inf,n);
m:=n;
for i:=1 to n do
read(inf,tr[i]);
close(inf);

end;
{----------------------------}
procedure heap(var a:data;n:integer;i:integer);
var
x:longint;
k:integer;
begin
x:=a[i];
k:=2*i;
while k<=n do
begin
if (k<n)and(a[k]>a[k+1]) then k:=k+1;
if x>a[k]
then begin
a[i]:=a[k];
i:=k;
k:=2*i;
end
else break;
end;
a[i]:=x;
end;
{----------------------------}
procedure insert(x:longint);
var
i:integer;
begin
n:=n+1;
tr[n]:=x;
i:=n;
while (i>1)and(x<tr[i div 2]) do
begin
tr[i]:=tr[i div 2];
i:=i div 2;
end;
tr[i]:=x;
end;
{----------------------------}
function delmin:longint;
begin
delmin:=tr[1];
tr[1]:=tr[n];
n:=n-1;
heap(tr,n,1);
end;
begin
init;
for i:=(n div 2)downto 1 do
heap(tr,n,i);
for i:=1 to m-1 do
begin
min1:=delmin;
min2:=delmin;
insert(min1+min2);
ans:=ans+min1+min2;
end;
rewrite(outf);
write(outf,ans);
close(outf);
end.