题目描述:
邮局选址问题
问题描述:
在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y 坐标表示南北向。各居民点的位置可以由坐标(x,y) 表示。街区中任意2 点(x1,y1) 和(x2,y2) 之间的距离可以用数值|x1-x2|+|y1-y2| 度量。
居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小。
编程任务:
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
数据输入:
由文件input.txt 提供输入数据。文件的第1 行是居民点数n,1<=n<=10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000<=x,y<=10000。
结果输出:
程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是n 个居民点到邮局的距离总和的最小值。
输入文件示例 输出文件示例
input.txt output.txt
5 10
1 2
2 2
1 3
3 -2
3 3
思路分析:
编辑
代码如下:
#include <iostream> #include <algorithm>//sort()函数头文件 using namespace std; #define N 10000 bool cmp(int a,int b){ return a<b; } int main() { int n;cin>>n; int X=0, Y=0;//(X,Y)记录邮局位置 int MinDis=0; int x[N],y[N]; for(int i=0;i<n;i++){ cin>>x[i]>>y[i]; } //街区中任意2 点(x1,y1) 和(x2,y2) 之间的距离可以用数值|x1-x2|+|y1-y2| 度量。 //所以可将x,y分开计算 sort(x,x+n,cmp);//排序 sort(y,y+n,cmp);//排序 X=x[n/2];Y=y[n/2]; //下图有解释,为何取[n/2],以及坐标数为奇/偶数此取值皆满足 //邮局位置找法思想,两边之和大于第三边,x取值必须在以两点为一组,在其连线上 for(int i=0;i<n;i++){ int dis1=x[i]-X;int dis2=y[i]-Y; if(dis1<0) dis1=-1*dis1;//距离为正值,若作差为负数,则取相反数 if(dis2<0) dis2=-1*dis2;//距离为正值,若作差为负数,则取相反数 MinDis=MinDis+dis1+dis2;//求和 } cout<<MinDis<<endl; return 0; }