邮局选址问题
不知道有没有bug,我感觉输入负数说不定会出bug,就是相当于零坐标只能建在最左面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.ArrayList; import java.util.Scanner; public class offic { public static int[] text = {1,2,3,4,5}; public static ArrayList<Integer> arrayList = new ArrayList(); public static void main(String[] args) { // System.out.println(llmin(text)); // System.out.println(min(text,0,3)); // place(text,llmin(text)); prin(); place(become_In(arrayList),llmin(become_In(arrayList))); } private static void prin(){ Scanner sc = new Scanner(System.in); while (true){ if (sc.hasNextInt()){ int i = sc.nextInt(); if (i != -1) arrayList.add(i); else break; } } } private static Integer[] become_In(ArrayList<Integer> x){ Integer[] arr = x.toArray(new Integer[x.size()]); return arr; } /** * 计算相应的路程长度 * @param data 传入路程的相对位置 * @return 返回最短的路程的长度 * x--起始位置 * y--终止位置 * 注:都是相对于数组下标而言 */ private static int min(Integer[] data,int x,int y){ int sum = 0; //为偶数的时候的路程长度 if ((y - x + 1)%2 == 0 ){ for (int i = 0; i < (y - x + 1) / 2; i++) { sum += data[y - i] - data[x + i]; } }else{ //为奇数是的路程长度 for (int i = 0; i < (y - x )/2; i++) { sum += data[y - i] - data[x + i]; } } return sum; } /** * 判断应该划分的位置 * @param data 传入基本数据的数组 * @return 划分线应该再返回值的后面的那个长度中 place为下标位置 ---place|---- */ private static int llmin(Integer[] data){ int sum = 0; int place = 0; int sum1; int sum2; for (int i = 0; i < data.length-1; i++) { sum1 = min(data , 0 , i); sum2 = min(data , i+1 ,data.length-1); if (sum < sum1 + sum2){ sum = sum1 + sum2; place = i; } } return place; } /** * 完成相应的输出操作 * @param data 输入的数据 * @param z 下标位置划分的位置 */ private static void place(Integer[] data,int z){ if ( (z - 0 + 1) % 2 == 0){ System.out.println("第一个邮局的位置在" + data[(z -1)/2] + "和" + data[((z-1)/2 + 1)] + "之间"); }else{ System.out.println("第一个邮局的位置在" + data[z/2] + "上"); } if (( data.length - 1 - z) % 2 == 0) { System.out.println("第二个邮局的位置在" + data[(z + (data.length - 1 - z) / 2)] + "和" + data[((z + (data.length - 1 - z) / 2) + 1)] +"之间"); }else{ System.out.println("第二个邮局的位置在" + data[(z + (data.length - z) / 2)] + "上"); } } private static void fin(Integer[] data){ int z = llmin(data); min(data , 0 , z); } private static void twop(){ } }