假设银行有4个柜台,假设某天有200位客户来办理业务,每个客户到达银行的时间和业务处理时间分别用两个数组arrive_time 和 process_time 来描述。
请写程序计算所有客户的平均等待时间,假设每个客户在去到营业部之后先拿号排队,然后在任意一个柜台有空闲的时候,号码数最小的客户上去办理,假设所有的客户拿到号码之后不会因为银行众所周知的慢而失去耐心走掉。
/**
* o(n)的解决方法,经测试和标准答案的结果是一样的
* 模拟银行业务场景:
* 用一个优先队列保存四个元素,四个元素为正在进行的任务执行完成的时间
* (优先队列会按照任务结束的时间排序, 从队列取到的第一个任务总是最先完成的那个)
* 用一个变量保存总的等待时间
*
* 先往优先队列放入4个任务,这4个任务的等待时间为0,所以优先队列的4个值为4个任务对应的到达时间和执行时间之和,
* 再把剩下的任务一个个加入优先队列,对于这个要加入的任务,他的等待时间为优先队列的第一个元素(四个任务中最先完成的任务)
* 的值减去当前任务的开始时间,所以这个要加入的任务的完成时间为“他的等待时间 + 任务到达时间 + 任务执行时间”
* 依次遍历完所有的任务,得到最终等待时间
* @param arrive_time
* @param process_time
* @return
*/
private static double solution(int[] arrive_time, int[] process_time) {
PriorityQueue<Integer> processing = new PriorityQueue<>();
for (int i = 0; i < 4; i++) {
processing.add(arrive_time[i] + process_time[i]);
}
int totalWaitTime = 0;
int waitTime;
for (int i = 4; i < arrive_time.length; i++) {
waitTime = processing.peek() - arrive_time[i];
//waitTime为负数时不需要等待
waitTime = Math.max(waitTime, 0);
totalWaitTime += waitTime;
processing.poll();
processing.add(arrive_time[i] + process_time[i] + waitTime);
}
return totalWaitTime * 1.0 / arrive_time.length;
}