现在的位置: 首页 > 综合 > 正文

poj 2231 Moo Volume

2013年04月22日 ⁄ 综合 ⁄ 共 531字 ⁄ 字号 评论关闭

又是一道大水题,真心不大爱了。

题意:给你n个数,让你求它们之间差值的绝对值的和(ai aj  与 aj ai算作2种),求这个值明显与顺序无关,所以可以将其排成从小到大的顺序。依次求过去,但是除了第一次需要遍历之外,其余的数都可以根据上一次推倒过来,*2先别着急,之前乘2只会浪费时间,等到最后统一乘2.

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10001;
int n;
long long sum,arr[N];
int main(void)
{
    while(cin>>n)
    {
     sum = 0;
     for(int i=1;i<=n;++i)
        scanf("%d",arr+i);
     sort(arr+1,arr+n+1);
      long long tmp = 0;
     for(int i=2;i<=n;++i)
     {
         tmp += (arr[i]-arr[1]);
     }
     sum += tmp;
     for(int i=2;i<n;++i)
     {
      tmp = tmp - (arr[i]-arr[i-1])*(n-i+1);
      sum += tmp;
     }
     sum *= 2;
     cout<<sum<<endl;
    }
    return 0;
}

抱歉!评论已关闭.