POJ 2231

POJ 2231

这道题是要求直线上所有两点间距离之和。但用一般的方法,时间会达到O(n^2),会TLE。可以从另一个角度考虑。
 1  #include < stdio.h >
 2  #include < stdlib.h >
 3  #define  N 10001
 4  int  n;
 5  __int64 a[N];
 6  __int64 sum;
 7  int  compare( const   void   * p, const   void   * q)
 8  {
 9       return  ( * ( int   * )p  -   * ( int   * )q);
10  }
11  int  main()
12  {
13       int  i,j;
14       while (scanf( " %d " , & n)  !=  EOF){
15           for (i  =   0 ;i  <  n;i ++ ){
16              scanf( " %d " , & a[i]);
17          }
18          qsort(a,n, sizeof (__int64),compare);
19          sum  =   0 ;
20           for (i  =   0 ;i  <  n - 1 ;i ++ ){
21              sum  +=  (n - i - 1 ) * (i + 1 ) * (a[i + 1 ] - a[i]);
22          }
23          printf( " %I64d\n " , 2 * sum);
24      }
25      system( " pause " );
26       return   0 ;
27  }
这时时间是O(n)。

你可能感兴趣的:(POJ 2231)