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.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3433507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值