1749 - 邮局选址问题
时间限制 : 1 秒
内存限制 : 128 MB
邮局选址问题
【问题描述:】
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由
坐标(x,y)表示。街区中任意2点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。
居民们希望在城市中选择建立邮局的最佳位置,使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
题目输入
题目输出
输入/输出样例
输入格式
输出格式
C++解答
#include<iostream> #include<algorithm> #include<cstdlib> using namespace std; int main() { int n; cin>>n; int x[n+1],y[n+1],sum=0; for(int i=1;i<=n;i++) cin>>x[i]>>y[i]; sort(x+1,x+n+1); sort(y+1,y+n+1); if(n%2==1) { int t=y[n/2+1]; for(int i=1;i<=n;i++) { if(y[i]>t) sum+=y[i]-t; if(y[i]<=t) sum+=t-y[i]; } t=x[n/2+1]; for(int i=1;i<=n;i++) { if(x[i]>t) sum+=x[i]-t; if(x[i]<=t) sum+=t-x[i]; } } if(n%2==0) { int t=(y[n/2]+y[n/2+1])/2; for(int i=1;i<=n;i++) { if(y[i]>t) sum+=y[i]-t; if(y[i]<=t) sum+=t-y[i]; } t=(x[n/2]+x[n/2+1])/2; for(int i=1;i<=n;i++) { if(x[i]>t) sum+=x[i]-t; if(x[i]<=t) sum+=t-x[i]; } } cout<<sum; return 0; }
Java解答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int x[] = new int[n]; int y[] = new int[n]; for (int i = 0; i < n; i++) { x[i] = sc.nextInt(); y[i] = sc.nextInt(); } int minx = Integer.MAX_VALUE; int miny = Integer.MAX_VALUE; for (int i = 0; i < n; i++) { int sumx = 0; int sumy = 0; int d = x[i]; int f = y[i]; for (int j = 0; j < n; j++) { sumx = sumx + Math.abs(d - x[j]); sumy = sumy + Math.abs(f - y[j]); } if (sumx < minx) minx = sumx; if (sumy < miny) { miny = sumy; } } System.out.println(minx + miny); } }