原题连接:
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 }