UVa 10041 Vito' s Family

UVa 10041 Vito' s Family
排序之后找到a[(1+n)/2]这个点,就是最优点,然后把n个数字的差值加起来就行了。
可以这么考虑:如果n为偶数,取a[(1+n)/2]时的解为ans。如果取a[(1+n)/2]-1,那么这个数字左边有n/2个数字,右边有n/2个数字,不如ans更优。奇数时类似考虑。
以下是我的代码:
#include < stdio.h >
void  Qsort( long   * a, long  begin, long  end)
{
    
long  i = begin,j = end,mid = a[(begin + end) / 2 ],t;
    
do {
         
while (a[i] < mid) i ++ ;
         
while (a[j] > mid) j -- ;
         
if (i <= j)
         {
            t
= a[i];a[i] = a[j];a[j] = t;
            i
++ ;j -- ;
         }
    }
while (i <= j);
    
if (begin < j) Qsort(a,begin,j);
    
if (i < end)   Qsort(a,i,end);
}
long  Abs( long  x)
{
    
return  (x > 0 ? x: - x);
}
int  main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/
    
const   long  maxn = 507 ;
    
long  test;
    scanf(
" %ld " , & test);
    
while (test -- )
    {
       
long  n,mid,ans,a[maxn];
       scanf(
" %ld " , & n);
       
for ( long  i = 1 ;i <= n;i ++ ) scanf( " %ld " , & a[i]);
       Qsort(a,
1 ,n);
       mid
= a[( 1 + n) / 2 ];
       ans
= 0 ;
       
for ( long  i = 1 ;i <= n;i ++ )
         ans
+= Abs(mid - a[i]);
       printf(
" %ld\n " ,ans);
    }
return   0 ;
}

你可能感兴趣的:(UVa 10041 Vito' s Family)