题目大意:
一个黑社会老大要搬家到纽约的某一条街上, 他在那条街上有很多的亲戚朋友,要找到一个地方,使得这个地方走到所有亲戚朋友家的总距离最短,输出总最短距离。
解析:
可以将题目理解为在一个数轴上有r个点,输出其中某个点到所有点距离最短的总和,输出最短总距离。注意某个点上可能存在多个重复的点。
贪心,不要被重复点给迷惑了,以为放在点数最多的位置上,总距离最小,其实放在中位数的点距离最小。
如果放在点数最多的点上,虽然到那个点的距离为0,但是到其他点的距离都增加了。
一个黑社会老大要搬家到纽约的某一条街上, 他在那条街上有很多的亲戚朋友,要找到一个地方,使得这个地方走到所有亲戚朋友家的总距离最短,输出总最短距离。
解析:
可以将题目理解为在一个数轴上有r个点,输出其中某个点到所有点距离最短的总和,输出最短总距离。注意某个点上可能存在多个重复的点。
贪心,不要被重复点给迷惑了,以为放在点数最多的位置上,总距离最小,其实放在中位数的点距离最小。
如果放在点数最多的点上,虽然到那个点的距离为0,但是到其他点的距离都增加了。
结果和放在中位数点上的结果相同。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N = 505;
int s[N];
int r;
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d",&r);
for(int i = 0; i < r; i++) {
scanf("%d",&s[i]);
}
sort(s,s+r);
int mid = r/2;
int sum = 0;
for(int i = 0; i < r; i++) {
sum += abs(s[mid] - s[i]);
}
printf("%d\n",sum);
}
return 0;
}