原题连接:

  http://acm.hdu.edu.cn/showproblem.php?pid=2083

题意:

  给定x轴上n个点,求任意一点到其他点距离和的最小值。

思路:

  (1)当n=2时:sum=|a-b|(点用a,b,c.......表示);

  (2)当n>2时:以n=3为例,a=1,b=5,c=10。sum1=|a-b|+|a-c|=13、sum2=|b-a|+|b-c|=6、sum3=|c-a|+|c-b|=14 (数据可自己模拟测试);

  由此可以看出当点是有序排列时,中间的点到其他点的距离和是最小的(n为奇、偶时,需另判断);

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int main()
 9 {
10   int t,n,a[501];
11   int i;
12   cin>>t;
13   while(t--)
14   {
15     cin>>n;
16     for(i=0;i<n;i++)
17     {
18       cin>>a[i];
19     }
20      sort(a,a+n);
21     if(n%2==0)
22     {
23       long long A=0,B=0;
24       for(i=0;i<n;i++)
25       {
26         A+=abs(a[n/2]-a[i]);
27         B+=abs(a[n/2-1]-a[i]);
28       }
29       if(A>B)
30         printf("%lld\n",B);
31       else
32         printf("%lld\n",A);
33     }
34     else
35     {
36       long long A=0;
37       for(i=0;i<n;i++)
38       {
39         A+=abs(a[n/2]-a[i]);
40       }
41       printf("%lld\n",A);
42     }    
43   }
44 
45 return 0;
46 }