USACO月赛2005 january volume

2013-09-18 08:12

由题可知,ans=∑i  ∑j(x[i]-x[j])

最后整理完之后应该是不同系数的X[i]相加,所以这道题就成了求不同x[i]的系数

对于X[i],它需要减前面(i-1)个不同的数,所以系数先是(i-1),而计算它前

面的每个数时都需要被X[i]减,所以系数成了2*(i-1),而且X[i]会被后面(n-i)

个数减,且计算后面的x时,都会减x[i],所以需要减2*(n-i)所以系数就变成了

2*(2*i-n-1),累加每个即可

//By BLADEVIL
var
    n                       :longint;
    i, j                    :longint;
    x                       :array[0..10010] of int64;
    ans                     :int64;

procedure swap(var a,b:int64);
var
    c                       :longint;
begin
    c:=a; a:=b; b:=c;
end;

procedure qs(low,high:longint);
var
    i, j, xx                :int64;
begin
    i:=low; j:=high; xx:=x[(i+j) div 2];
    while i<j do
    begin
        while x[i]<xx do inc(i);
        while x[j]>xx do dec(j);
        if i<=j then
        begin
            swap(x[i],x[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs(i,high);
    if j>low then qs(low,j);
end;


begin
    assign(input,'volume.in'); reset(input);
    assign(output,'volume.out'); rewrite(output);
    read(n);
    for i:=1 to n do read(x[i]);
    qs(1,n);
    j:=n;
    for i:=n downto 1 do ans:=ans+(2*(i-1)-2*(n-i))*x[i];
    writeln(ans);
    close(input); close(output);
end.

 

posted on 2013-11-20 14:23  BLADEVIL  阅读(260)  评论(0编辑  收藏  举报