题目原链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2083
分析:
简单题,两种方法
- 暴力求解,因为点数最多n=500,这个的时间复杂度为O(n^2):把各个点都试过,第一个点到其他点的距离之和,第二个点到其他点的距离之和,......,最后一个点到其他点的距离之和。把这些距离存到一个数组中,然后快排sort,找出最小的。
- 理解题目,其实就是找中间点,中间点到其他的距离之和是最小,前提要求把点进行一个排序。所以无论n为奇数还是偶数,都是n/2为中间点,那就是这个中间点到其他点的距离就是最小距离。
AC代码1:(暴力)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int point[510];
int cost[510];
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
memset(cost,0,sizeof(cost));
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&point[i]);
//int len = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
cost[i] += abs(point[i]-point[j]);
}
}
sort(cost,cost+n);
printf("%d\n",cost[0]);
}
return 0;
}
AC代码2:(找到中间点)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int ans;
int n,T;
int x[11111];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
sort(x,x+n);
ans=x[n/2]; //因为是整型处理,在此处n的奇偶性无所谓。
int s=0;
for(int i=0;i<n;i++)
s+=abs(x[i]-ans);
printf("%d\n",s);
}
return 0;
}