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.  

以后还要加油啊!!!

转载于:https://www.cnblogs.com/zyxx233/archive/2012/10/05/2712442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值