1749 - 邮局选址问题

通过次数

0

提交次数

0

时间限制 : 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);
    }
}