贪心算法--邮局选址,输油管道问题

描述

在一个按照东西和南北方向划分成规整街区的城市里,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

Copy

样例输出1

6

Copy

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/randyhe_/article/details/78645677
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞