vijos p1097(合并果子)

向总今天中午跟我们说要做合并果子,用堆来做,堆是前几天才学的,还没怎么熟悉。

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

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

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

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

 1 program P1097;
 2 var
 3         s,n,i,j,k,u,x,y:longint;
 4         a:array[1..10001] of longint;
 5 procedure shai(m,n:longint);
 6 var
 7        i,j,t:longint;
 8 begin
 9         i:=m; j:=2*m;
10         while (j<=n) do
11         begin
12         if a[j]>a[j+1] then inc(j);
13         if a[i]>a[j] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end;
14         i:=j; j:=2*i;
15         end;
16 end;
17 {=========================================}
18 begin
19         readln(n);
20         for i:=1 to n do
21         read(a[i]);
22         a[n+1]:=maxlongint;
23         for i:=n div 2 downto 1 do
24         shai(i,n);
25         s:=0;u:=0;
26         repeat
27         s:=s+a[1];
28         x:=a[1];
29         a[1]:=a[n];
30         a[n]:=maxlongint;
31         dec(n);
32         shai(1,n);
33         s:=s+a[1];
34         x:=x+a[1];
35         a[1]:=x;
36         shai(i,n);
37         until n<=1;
38         write(s);
39 end.  

以后还要加油啊!!!

posted @ 2012-10-05 19:30  改名字干什么  阅读(164)  评论(0编辑  收藏  举报