邮局选址问题

不知道有没有bug,我感觉输入负数说不定会出bug,就是相当于零坐标只能建在最左面

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(){

    }
}
邮局选址

 

posted @ 2022-05-18 22:07  七色angel  阅读(29)  评论(0编辑  收藏  举报