- 2022-05-21:给定一个数组arr,长度为n,
表示n个服务员,每个人服务一个人的时间。
给定一个正数m,表示有m个人等位。
如果你是刚来的人,请问你需要等多久?
假设:m远远大于n,比如n<=1000, m <= 10的9次方,该怎么做?
来自谷歌。
/**
* 求解自己
* @param arr
* @param m
* @return
*/
public static int minWaitingTime(int[] arr,int m){
//当没有护士的时候
if (arr == null || arr.length ==0){return -1;};
//定义一个堆 重小往大的排序 小根堆
PriorityQueue<int[]> heap = new PriorityQueue<>((a,b)->(a[0] - b[0]));
//数组的长度
int n = arr.length;
//循环这个数组
for (int i=0;i<n;i++){
//往堆里面添加元素
heap.add(new int[]{0,arr[i]});
}
//循环排队的人
for (int i=0;i<m;i++){
//挑出那个时间最少的人
int[] cur = heap.poll();
//这个用户要对的护士
cur[0]+=cur[1];
heap.add(cur);
}
return heap.peek()[0];
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
//定义长度
int len = 50;
//定义结果
int value = 30;
//定义最大值
int mMax = 3000;
//定义测试次数
int testTime = 10;
System.out.println("测试开始");
for (int i=0;i<testTime;i++){
//定义n个护士
int n = (int) (Math.random()*len)+1;
//定义这个数组里面的值
int[] arr = randomArray(n,value);
//定义m
int m = (int) (Math.random()*mMax);
int ans = minWaitingTime(arr,m);
System.out.println("护士数组:"+ Arrays.toString(arr)+",长度为+"+arr.length+",前面有"+m+"个用户,我需要等待的时间为:"+ans);
}
System.out.println("测试结束");
}
public static int[] randomArray(int n, int v){
//新建这n个数组
int[] arr = new int[n];
//循环放入值
for (int i=0;i<n;i++){
arr[i] = (int)(Math.random()*v)+1;
}
return arr;
}