PTA 铺设油井管道 JAVA

某石油公司有n口油井,为方便输送石油,计划修建输油管道。根据设计要求,水平方向有一条主管道,每口油井修一条垂直方向的支线管道通向主管道。请设计一种算法确定主管道的位置,使得所有油井到主管道之间的支线管道长度的总和最小。提示:复杂度为O(n)才能通过所有测试用例。

pipe.png

输入格式:

每个输入文件为一个测试用例,每个文件的第一行给出一个正整数n(1≤n≤1000000),表示油井数量,从第二行起的n行数据,表示每口油井的位置,每行包含以空格分隔的两个整数,分别表示每口油井的横坐标x(−10000≤x≤10000)和纵坐标y(−10000≤y≤10000)。

输出格式:

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

输入样例:

在这里给出一组输入。例如:

4
-1 1
2 2
5 -1
-3 7



结尾无空行

输出样例:

9



结尾无空行

 由于题目说管道是从左往右水平的,所以跟x坐标无关

代码:

 1 package 铺设油井管道;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 public class Main {
 5     static int[] bucket = new int[20001];
 6     public static void main(String[] args) {
 7         for(int i = 0;i < 20001;i++) {
 8             bucket[i] = 0;
 9         }
10         Scanner scan = new Scanner(System.in);
11         int n = scan.nextInt();
12         int x[] = new int[n];
13         int y[] = new int[n];
14         for(int i = 0;i <n;i++){
15                   x[i] = scan.nextInt();
16                   y[i] = scan.nextInt();
17           }//修改为桶排序 0 == -10000
18 //        Arrays.sort(y); 
19               for(int i = 0;i < n;i++) {
20             bucket[y[i] + 10000]++;
21         }
22         int t = 0;
23         for(int i = 0;i < bucket.length;i++) {
24             if(bucket[i] > 0 && t < n) {
25                 bucket[i]--;
26                 y[t++] = i - 10000;
27             }
28         }
29         double s = 0;
30          int z = n / 2;
31          for(int i = 0;i < n;i++)s += Math.abs(y[z] - y[i]);
32         System.out.println((int)s);
33     }
34 
35 }

 

 

 

posted @ 2021-12-30 20:17  Imepeto  阅读(603)  评论(0)    收藏  举报