题目: 思路:铺设油管与水平距离无关,只与竖直距离有关,对此建立坐标系求解y值中位数(y_mid),并将各点纵坐标到y_mid的距离累加,累加后的值便是所要的最小距离。 数组x,y:分别存储坐标点 快排:求中位数 import java.util.Scanner; public class Demo{ static int n;//管道数 public static void main(String[] args) { System.out.println("请输入管道数目:"); Scanner sc=new Scanner(System.in); n=sc.nextInt();//管道个数 int[] x_arr=new int[n];//x轴坐标的值 int[] y_arr=new int[n];//y轴坐标的值 System.out.println("请输入坐标值:"); for(int i=0;i<n;i++){ x_arr[i]=sc.nextInt(); y_arr[i]=sc.nextInt(); } //对数组y_arr的值进行排序 quickSort(0,n-1,y_arr); //求y轴值的中位数 int mid=0; if(n%2==0){//n为偶数 mid= (y_arr[n/2-1]+y_arr[n/2])/2; } else{//n为奇数 mid=y_arr[n/2]; } int j=1;//计管道数,只为输出好看点 for (int k:y_arr ) { System.out.println("子管道"+j+++"的长度:"+k); } //对y数组所有值到中位数的距离进行累加 int len=0; for(int i=0;i<n;i++){ //当y值小于中位数 if(y_arr[i]<mid){ len+=(mid-y_arr[i]); } //当y值大于中位数 else len+=(y_arr[i]-mid); } System.out.println("管道长度总和最小值为:"+len); } ///划分 static int Parition(int[] arr,int first,int end){ int i=first,j=end; while (i<j){//当i<j时进入循环 while (i < j && arr[i] <= arr[j]) {//i和j未碰头且左边小于等于右边 j--; } if(i<j){//判断是否碰头 int temp; temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; i++; } while(i<j&&arr[i]<=arr[j]){ i++; } if(i<j){ int temp; temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; j++; } } return i;//排序后基准值下标 } static void quickSort(int start,int end,int[] arr){ int middle; if(start<end){ middle=Parition(arr,start,end);//划分,mid quickSort(start,middle-1,arr); quickSort(middle+1,end,arr); } } }