输油管道问题

问题描述:  某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有 n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主 管道相连。如果给定 n 口油井的位置,即它们的 x 坐标(东西向)和 y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置? 

证明可在线性时间内确定主管道的最优位置。 给定 n 口油井的位置, 计算各油井到主管道之间的输油管道最小长度总和。


输入的第 1 行是油井数 n,1<=n<=10000。接下来 n 行是
油井的位置,每行 2 个整数 x 和 y,-10000<=x,y<=10000。


输出油井到主管道之间的输油管道最小长度总和。

分体分析:假设现在只有一口油井,那主管道应该穿过油井,无需多言。如果现在有两口井,显然主管道在两口井中任一位置穿过距离要小于在两口井一侧的距离。而且在中间穿   过的距离为两口井的Y坐标之差(绝对值)。如果,现在有三口井,很显然,主管道从中间的井穿过时距离最短,为两侧的井的Y距离之差,而中间的井正好为三口井的中位数。四口井的时候则从最中间的两口井间任一位置穿过距离最短,而此时的位置依然是中位数,距离则为每一个井与中位数距离的差值和。以此类推。

 

编程任务:首先创建一个油井总数大小的数组存放每口油井的位置,由于并未用到X坐标,就随意存放到Y数组中就好,然后排序,求出中位数。(奇数偶数的中位数都可以用总数n/2表示,因为偶数时用的两个中位数的后者),然后算出每个油井与中位数坐标距离之和。

 

 1 package com.school.algorithm.experiment2;
 2 
 3 import java.util.Arrays;
 4 import java.util.Scanner;
 5 
 6 /**
 7  * 油井距离问题
 8  * @author AganRun
 9  */
10 public class OilWell {
11 
12     public static void main(String[] args){
13         
14         Scanner scan = new Scanner(System.in);
15         int n = scan.nextInt();        //油井数
16         int[] y = new int[n];    //记录每个油井的Y坐标
17         int sum = 0;                //总距离
18         for(int temp=0; temp<n; temp++){
19             y[temp] = scan.nextInt();    //因为题中X坐标并未用到,所以并未申请X的储存空间,放在了Y数组中
20             y[temp] = scan.nextInt();
21         }
22         Arrays.sort(y);        //对Y坐标进行排序
23         int midNum = n/2;    //中位数,无论总数奇数还是偶数(偶数的话为中位数中的后一个)

24 for(int temp=0; temp<n; temp++){ 25 sum += Math.abs( y[midNum] - y[temp]); 26 } 27 System.out.println(sum); //输出油井到主管道最小长度之和 28 } 29 }

这是我的第一篇博客,可能写的不是很好,但是真的很认真的在做,本人也是菜鸟,但是在不断学习,不断记录,不对的地方大家多多指教,谢谢大家!!!

 

  

原文地址:https://www.cnblogs.com/AganRun/p/6551442.html