华为机试真题Java 实现【最大化控制资源成本】【2022.11 Q4】

该文描述了一个关于如何设计算法来解决任务混部问题,目的是在最小化资源成本的同时最大化资源利用率。给定一系列任务,每个任务具有开始时间、结束时间和并行度,算法需确定完成所有任务所需的最少服务器数量。示例展示了算法应如何处理不同任务的时间和并行度要求。
摘要由CSDN通过智能技术生成

问题描述

公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题:有taskNum项任务,每个任务有开始时间(startTime),结束时间(endTime),并行度(parallelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完成立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器,从而最大最大化控制资源成本。

输入描述:

第一行输入为taskNum,表示有taskNum项任务

接下来taskNum行,每行三个整数,表示每个任务的开始时间

(startTime ),结束时间(endTime ),并行度(parallelism)

输出描述:

一个整数,表示最少需要的服务器数量

示例1

输入输出示例仅供调试,后台判断数据一般不包含示例

输入

3

2 3 1

6 9 2

0 5 1

输出

2

说明

一共有三个任务,第一个任务在时间区间【2,3】运行,占用1个服务

器,第二个任务在时间区间【6,9】运行,占用2个服务器,第三个任

务在时间区间【0,5】运行,占用1个服务器,需要最多服务器的时间

区间为【2,3】和【6,9】,需要2个服务器。

示例2

输入输出示例仅供调试,后台判断数据一般不包含示例

输入

2

3 9 2

4 7 3

输出

5

说明

一共两个任务,第一个任务在时间区间【3,9】运行,占用2个服务

器,第二个任务在时间区间【4,7】运行,占用3个服务器,需要最多

服务器的时间区间为【4,7】,需要5个服务器。

备注:

1<=taskNum<=100000

0<=startTime<endTime<=50000

1<=parallelism<=100

个人解法

不保证通过率

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int current = 0;
        String first = br.readLine();
        int count = Integer.parseInt(first);
        ArrayList<int[]> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            String[] split = br.readLine().split(" ");
            list.add(new int[]{Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2])});
        }
        list.sort(Comparator.comparingInt(o -> o[1]));
        int end = list.get(list.size() - 1)[1];
        list.sort(Comparator.comparingInt(o -> o[0]));
        int start = list.get(0)[0];
        int max = 0;
        LinkedList<int[]> queue = new LinkedList<>();
        for (int i = start; i < end; i++) {
            if (list.isEmpty()) break;
            if (!queue.isEmpty() && queue.peek()[1] == i) {
                current -= queue.poll()[2];
            }
            if (list.get(0)[0] == i) {
                current += list.get(0)[2];
                max = Math.max(max, current);
                queue.offer(list.get(0));
                list.remove(0);
                queue.sort(Comparator.comparingInt(o -> o[1]));
            }
        }
        System.out.println(max);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值