您的位置:首页 > 其它

vijos p1097(合并果子)

2012-10-05 19:30 190 查看
向总今天中午跟我们说要做合并果子,用堆来做,堆是前几天才学的,还没怎么熟悉。

程序的大概思路是用 贪心+堆结构,不知道快排能否过,现在还没试。

每次取出一个最小值,筛一次,维护堆(每次都加了一个maxlongint,防止越界的情况,想向各位大牛们请教更好的方法。);

两个最小值相加,既是该次所耗体力,再把它放入堆中。

代码...............

program P1097;
var
s,n,i,j,k,u,x,y:longint;
a:array[1..10001] of longint;
procedure shai(m,n:longint);
var
i,j,t:longint;
begin
i:=m; j:=2*m;
while (j<=n) do
begin
if a[j]>a[j+1] then inc(j);
if a[i]>a[j] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end;
i:=j; j:=2*i;
end;
end;
{=========================================}
begin
readln(n);
for i:=1 to n do
read(a[i]);
a[n+1]:=maxlongint;
for i:=n div 2 downto 1 do
shai(i,n);
s:=0;u:=0;
repeat
s:=s+a[1];
x:=a[1];
a[1]:=a
;
a
:=maxlongint;
dec(n);
shai(1,n);
s:=s+a[1];
x:=x+a[1];
a[1]:=x;
shai(i,n);
until n<=1;
write(s);
end.


以后还要加油啊!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: