向总今天中午跟我们说要做合并果子,用堆来做,堆是前几天才学的,还没怎么熟悉。
程序的大概思路是用 贪心+堆结构,不知道快排能否过,现在还没试。
每次取出一个最小值,筛一次,维护堆(每次都加了一个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.
以后还要加油啊!!!