2004年分区联赛提高组之二 合…

来源:互联网 发布:ucloud mac 编辑:程序博客网 时间:2024/04/29 16:51

Description

  在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 
  每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 
  因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 
  例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。 

Input

  输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

Output

  输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。

Sample Input

 

1 2 9 

 

Sample Output

 

15

 

Hint

对于30%的数据,保证有n<=1000: 
对于50%的数据,保证有n<=5000; 
对于全部的数据,保证有n<=10000。 



解题思路:先读入数据,然后从n-11循环,快排,把a[i]a[i+1]相加,把这个数加到ans上,并且把n减一,最后输出ans即可。



程序:

var

  a:array[1..10000] of longint;

  n,ans:longint;


procedure qsort(l,r:longint);

  var

    i,j,key,temp:longint;

  begin

    if l>=r then exit;

    i:=l;j:=r;

    key:=a[(l+r) div 2];

    repeat

      while (a[i]>key) do inc(i);

      while (a[j]

      ifi<=j then

     begin

       temp:=a[i];a[i]:=a[j];a[j]:=temp;

       inc(i);dec(j);

     end;

    until i>j;

    qsort(l,j);

    qsort(i,r);

end;


procedure main;

  var

    i:longint;

  begin

    readln(n);

    for i:=1 to n do

     read(a[i]);

    for i:=n-1 downto 1 do

     begin

       qsort(1,n);

       a[i]:=a[i]+a[i+1];

       inc(ans,a[i]);

       dec(n);

     end;

    writeln(ans);

end;


begin

  main;

end.


版权属于: Chris

原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0hy.html

转载时必须以链接形式注明原始出处及本声明。

0 0