某银行有4个柜台,假设某天有若干位客户来办理业务,每个客户到达银行的时间和取款需要的时间分别用两个数组arrvie_time(已经按到达时间排序)和process_time来描述。
请写程序计算所有客户的平均等待时间,假设每个客户在取款之前先拿号排队,然后在任意一个柜台有空闲的时候,号码数最小的客户上去办理,假设所有的客户拿到号码之后都不会失去耐心走掉。
示例:输入:arrvie_time[1.0,2.0, 3.0,4.0, 4.0, 8.0],process_time=[50.0, 20.0, 11.0, 25.0, 30.0, 40.0]
输出:4.0 (24.0 / 6)

首先分析一下每一个客户的等待时间怎么计算:
前四个不用等待有空闲柜台,第五个客户需要等待,必须等到第一个先办理完取款的人离开才能办理,那么他的等待时间就是第一个办理完人的到达时间+办理时间-自身的到达时间。后面的依次类推。如果前面的人有等待的时间,还要把这个时间算进去。 每循环一次,都需要将办理柜台取款的人的办理后的时间进行重新排序计算出最先办理完取款的人。 排序这里用的是java的Comparator接口

那么就需要两个数组,一个存所有客户按到达时间排序的数组,一个存办理取款的人的数组。每当办理取款的数组排序完毕后就相当于有人已经取完款了,这时最新办完取款的客户移除,将下一个客户添加到柜台取款的数组中,随后进行排序。

最后将所有客户的等待时间进行算数平均值计算。

下面给出代码示例:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        System.out.println("请输入arrive_time,用逗号\",\"隔开:\n");
        Scanner scanner = new Scanner(System.in);
        String arrive_time = scanner.nextLine();
        System.out.println("请输入process_time,用 逗号\",\"隔开:\n");
        String process_time = scanner.nextLine();

        String[] arriveTime = arrive_time.split(",");
        String[] processTime = process_time.split(",");
        // 格式校验
        if (arriveTime.length != processTime.length) {
            System.out.println("输入格式错误");
            return;
        }
        Customer[] a = new Customer[arriveTime.length];
        for (int i = 0; i < arriveTime.length; i++) {
            a[i] = new Customer(i, Float.valueOf(arriveTime[i]), Float.valueOf(processTime[i]), 0f);
        }

        // 柜台数量
        int counter = 4;
//        initCustomer();
        // 假设柜台数量大于客户数量,不用排队
        if (a.length < counter) {
            System.out.println("time: 0");
            return;
        }
        // 对客户到达时间进行排序, 这一步可以省略,前提是输入到达时间按顺序从小到大排序
        init(a);
        // 柜台客户的队列
        Customer[] t = Arrays.copyOfRange(a, 0, counter);
        for (int i = counter; i < a.length; i++) {
            // 对柜台的人进行排序
            sort(t);
            // 计算下一个等待的人的等待时间
            a[i].waitTime = t[0].arriveTime + t[0].processTime + t[0].waitTime - a[i].arriveTime;
            // 插入到柜台数组
            t[0] = a[i];
        }
        // 计算等待时间
        float waitTime = 0;
        for (int i = 0; i < a.length; i++) {
            waitTime += a[i].waitTime;
        }
        System.out.println("time:" + waitTime / a.length);

    }

    private static void initCustomer() {
        // 客户
//        Customer customer2 = new Customer(2, 2.0f, 20.0f, 0f);
//        Customer customer4 = new Customer(4, 4.0f, 25.0f, 0f);
//        Customer customer5 = new Customer(5, 4.0f, 30.0f, 0f);
//        Customer customer = new Customer(1, 1.0f, 50.0f, 0f);
//        Customer customer3 = new Customer(3, 3.0f, 11.0f, 0f);
//        Customer customer6 = new Customer(6, 8.0f, 40.0f, 0f);
//        Customer[] a = new Customer[]{customer, customer2, customer3, customer4, customer5, customer6};
    }

    public static void init(Customer[] customers) {
        Comparator comparator = new Comparator1();
        Arrays.sort(customers, comparator);
    }

    public static void sort(Customer[] customers) {
        Comparator2 compareor2 = new Comparator2();
        Arrays.sort(customers, compareor2);
    }

}

class Customer {

    int id;
    float arriveTime;
    float processTime;
    float waitTime;

    public Customer(int id, float arriveTime, float processTime, float waitTime) {
        this.id = id;
        this.arriveTime = arriveTime;
        this.processTime = processTime;
        this.waitTime = waitTime;
    }

}

class Comparator1 implements Comparator<Customer> {

    @Override
    public int compare(Customer o1, Customer o2) {
        return (int) (o1.arriveTime - o2.arriveTime);
    }
}

class Comparator2 implements Comparator<Customer> {

    @Override
    public int compare(Customer o1, Customer o2) {
        return (int) (o1.arriveTime + o1.processTime + o1.waitTime - o2.arriveTime - o2.processTime - o2.waitTime);
    }
}