PostOffice最小距离问题

在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。   街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。   居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。   任务:给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。

输入

  第1 行是居民点数n,1 < = n < =10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000 < =x,y < =10000。

输出

n 个居民点到邮局的距离总和的最小值。

 
PostOffice
 1000(ms)
 65535(kb)
 651 / 2273
  在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。   街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。   居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。   任务:给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。

输入

  第1 行是居民点数n,1 < = n < =10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000 < =x,y < =10000。

输出

n 个居民点到邮局的距离总和的最小值。

样例输入

5
1 2
2 2
1 3
3 -2
3 3

样例输出

10

解:因为要使最小距离最小的话,则应该使x,y轴上的东西分别最小,因此,我们可以将x,y轴分开看,要使距x轴上的距离最小的话,那么那个点应该是最中间的那个点,而题目又恰好给出了点的个数,所以我们取n/2应该是最为合理的,y轴同理

因此代码为

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10000], b[10000];//数组开的比较大,要放在主函数的外面,不然会超时
int main()
{
int n,i;
int sum = 0;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> a[i] >> b[i];
}

sort(a, a + n);
sort(b, b + n);
for (i = 0; i < n; i++)//要使距离最小,就选取最中间的点为x,y上的标准
{
sum += abs(a[i] - a[n / 2]) + abs(b[i] - b[n / 2]);
}
cout << sum << endl;
return 0;
}



posted on 2018-04-09 08:50  痒痒肉  阅读(1072)  评论(0)    收藏  举报

导航