每日一题

  1. 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;
    }

posted @ 2022-05-22 22:07  一棵小萌新  阅读(46)  评论(0)    收藏  举报