/**
Description
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
Input
测试数据有多组。每组的第一行是居民点数n, 1 <= n <= 10000.接下来的n行是居民点的位置,每行2个整数 x 和 y, -10000 <= x <= 10000。
Output
对于每组测试数据,输出n个居民点到邮局的距离总和的最小值及一个回车。
Sample Input
5
1 2
2 2
1 3
3 -2
3 3
Sample Output
10
*/
#include<iostream>
#include<math.h>
using namespace std;
void quickSort(int* num,int left, int right);
int distance1(int* num1, int* num2, int x, int y, int n);
int sum(int *num, int x, int y);
const int MAX = 10000;
int main()
{
int n;
int locateX[MAX] = {0};
int locateY[MAX] = {0};
int postx;
int posty;
int sum = 0;
//cout << "请输入居民数\n" ;
cin >> n;
//cout << "输入居民点的位置\n";
for (int i = 0; i < n; i++)
{
cin >> locateX[i];
cin >> locateY[i];
}
//cout << "a wo ni ";
quickSort(locateX, 0, n -1);
quickSort(locateY, 0, n -1);
//cout <<"jahajfklaf";
postx = locateX[n / 2];
posty = locateY[n / 2];
sum = distance1(locateX,locateY,postx,posty,n);
cout << sum;
cin.get();
cin.get();
return 0;
}
void quickSort(int* num,int left, int right)
{
if(left < right)
{
int key = num[left];
int low,high;
low = left, high = right;
while(low < high)
{
while (low < high && num[high] > key)
{
high--;
}
num[low] = num[high];
while (low < high && num[low] <= key)
{
low++;
}
num[high] = num[low];
}
num[low] = key;
quickSort(num,left,low - 1);
quickSort(num,low + 1, right);
}
}
int distance1(int* num1, int* num2, int x, int y, int n)
{
int sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++)
{
sum1 += abs(num1[i] - x);
sum2 += abs(num2[i] - y);
}
return (sum1 + sum2);
}
10-16