华为OD机试 - 任务混部 最大化控制资源成本(Java)

题目描述

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


输入描述

第一行输入为taskNum ,表示有taskNum 项任务,接下来taskNum 行,每行三个整数,表示每个任务的开始时间 (startTime) ,结束时间 (endTime) ,并行度(parallelism)

输出描述

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


自测用例

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

输入 输出
3
1 10 3
2 20 2
3 30 1
6
2
3 5 2
6 7 3
3

Java源码

class Task {
    int startTime;
    int endTime;
    int parallelism;

    public Task(int startTime, int endTime, int parallelism) {
        this.startTime = startTime;
        this.endTime = endTime;
        this.parallelism = parallelism;
    }
}
//返回最大占用数
public int findMaxParallelism(List<Task> tasks) {
        List<int[]> events = new ArrayList<>();
        for (Task task : tasks) {
            events.add(new int[]{task.startTime, task.parallelism});
            events.add(new int[]{task.endTime, -task.parallelism});
        }
        events.sort((a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);

        int maxParallelism = 0;
        int currentParallelism = 0;
        for (int[] event : events) {
            currentParallelism += event[1];
            maxParallelism = Math.max(maxParallelism, currentParallelism);
        }
        return maxParallelism;
    }
//main方法
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int taskNum = scanner.nextInt();
        List<Task> tasks = new ArrayList<>();
        for (int i = 0; i < taskNum; i++) {
            int startTime = scanner.nextInt();
            int endTime = scanner.nextInt();
            int parallelism = scanner.nextInt();
            tasks.add(new Task(startTime, endTime, parallelism));
        }
        scanner.close();

        System.out.println(findMaxParallelism(tasks));
    }

你可能感兴趣的:(算法,java,算法,开发语言)