20210602:力扣第243周周赛(下)

力扣第243周周赛(下)

题目

    1. 使用服务器处理任务
      在这里插入图片描述
    1. 准时抵达会议现场的最小跳过休息次数
      在这里插入图片描述

思路与算法

    1. 使用服务器处理任务:典型双堆问题,逻辑清晰即可写出代码,今天两题使用Java来写
    1. 准时抵达会议现场的最小跳过休息次数:不太经典的dp,注意动态转移方程的分析过程,代码中需要注意浮点运算不要超出范围。其余的正常书写即可。

代码实现

    1. 使用服务器处理任务
class Solution {
    // int数组:0存放索引,1存放权重,2存放最后一次任务结束时间
    public int[] assignTasks(int[] servers, int[] tasks) {
        PriorityQueue<int[]> allServer = new PriorityQueue<>(new Comparator<int[]>(){
            @Override
            public int compare(int [] o1, int [] o2) {
                if(o1[2] != o2[2]) return o1[2] - o2[2];
                else{
                    if(o1[1] != o2[1]) return o1[1] - o2[1];
                    else return o1[0] - o2[0];
                }
            }
        });
        PriorityQueue<int[]> freeServer = new PriorityQueue<>(new Comparator<int[]>(){
            @Override
            public int compare(int [] o1, int [] o2) {
                if(o1[1] != o2[1]) return o1[1] - o2[1];
                else return o1[0] - o2[0];              
            }
        });

        for(int i = 0; i < servers.length; i++)  
            allServer.add(new int[]{i, servers[i], 0});

        int temp[];
        int time = 0;
        for(int i = 0; i < tasks.length; i++){   
            // 服务器可用时,按顺序添加ready的服务器  
            while(allServer.size() != 0 && allServer.peek()[2] <= time)
                freeServer.add(allServer.poll());
            // 如果当前空闲的Server列表为空,则需要等待下一台可以使用的server
            if(freeServer.size() == 0){
                temp = allServer.poll();
                time = temp[2];       
            }
            else 
                temp = freeServer.poll();

            // 每次更新当前最先ready的服务器的结束时间,并且回收该服务器到服务器组 
            temp[2] = time + tasks[i];
            allServer.add(temp);
            tasks[i] = temp[0];

            if(time <= i) 
                time++;
        }
        return tasks;
    }
}
    1. 准时抵达会议现场的最小跳过休息次数
class Solution {
    public int minSkips(int[] dist, int speed, int hoursBefore) {
        int n=dist.length;
        long[][] dp=new long[n+1][n+1];
        for(int i=1;i<=n;i++){
            for(int j=0;j<=n;j++){
                dp[i][j]=Integer.MAX_VALUE;
            }
        }
        for(int i=1;i<=n-1;i++){
            for(int j=0;j<=n;j++){
                if(j==0){
                    dp[i][j]=(dp[i-1][j]+dist[i-1]+speed-1)/speed*speed;
                }else{
                    dp[i][j]=Math.min(dp[i-1][j-1]+dist[i-1],(dp[i-1][j]+dist[i-1]+speed-1)/speed*speed);
                }
            }
        }
        for(int i=0;i<=n;i++){
            if((double)(dp[n-1][i]+dist[n-1])/(double)speed<=(double)hoursBefore)
                return i;
        }
        return -1;
    }
}

写在最后

  1. 鸿蒙是真滴nb!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值