描述
在一个按照东西和南北方向划分成规整街区的城市里,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。
输出
程序运行结束时,将计算结果输出。第1 行中的数是n 个居民点到邮局的距离总和的最小值。
样例输入
5
1 2
2 2
1 3
3 -2
3 3
样例输出
10
#include <iostream>
#include <cmath>
#define NUM 10000
using namespace std;
int move_min(int *num,int N,int center)
{
int sum = 0;
for(int i = 0; i<N;i++){
sum +=abs(num[i]-center);
}
return sum;
}
int main()
{
int X[NUM],Y[NUM];
int N;
scanf("%d",&N);
for( int i = 0; i<N; i++){
scanf("%d %d",&X[i],&Y[i]);
}
sort(X, X+N);
int x0=X[(0+N/2)];//找到中位数;
int move_x = move_min(X, N, x0);//计算每一个x到中位数的距离;
sort(Y, Y+N);
int y0 =Y[(0+N)/2];//计算y 的;
int move_y = move_min(Y, N, y0);
cout <<move_x+move_y<<endl;
return 0;
}
还有一个输油管道问题;;;;两个方法一样;
描述
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?
编程任务:
给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和.
格式
输入格式
输入第1行是油井数n,1≤n≤10000。
接下来n行是油井的位置,每行2个整数x和y,-10000≤x,y≤10000。
输出格式
输出第1行中的数是油井到主管道之间的输油管道最小长度总和。
样例1
样例输入1
5
1 2
2 2
1 3
3 -2
3 3
样例输出1
6