在一個平面上有n(1<=n<=100000)個村莊,每個村莊通過座標(xi,yi)標示位置,-10^9<=xi,yi<=10^9。現在想要建一個郵局,使得到各個村莊的距離之和最短。
在這個問題中,距離定義爲曼哈頓距離,即點i和點j的距離等於|xi-xj|+|yi-yj|
輸入第一行爲n,表示村莊的數量
接下來n行每行有兩個整數,表示一個村莊的座標
輸出一個數字,表示建立的郵局到各個村莊的和
提示:
村莊和郵局的座標都一定爲整數
對於超過int的數字,請用long long,輸入和讀取用%lld
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
long long int x[100005], y[100005];//只能橫豎走,所以分開看就行
int comp(const void*a, const void*b)
{
return *(long long int*)a - *(long long int*)b;
}
int main()
{
int n;
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
scanf("%lld%lld", &x[i], &y[i]);
qsort(x, n, sizeof(long long int), comp);
qsort(y, n, sizeof(long long int), comp);
long long sum = 0;
for (i = 0; i < n; i++)
sum += abs(x[n - 1 - i] - x[i]);
for (i = 0; i < n; i++)
sum += abs(y[n - 1 - i] - y[i]);
printf("%lld\n", sum/2);//sum全都加了兩遍,最後除2
return 0;
}