题目要求
公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务分布问题:有taskNum项任务,每人任务有开始时间(startTime) ,结更时间(endTme) 并行度(paralelism) 三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完成立即释放(结束时刻不占用)。任务分布问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务分布最少需要多少服务器,从而最大最大化控制资源成本。
输入描述
第一行输入为taskNum,表示有taskNum项任务 接下来taskNum行,每行三个整数,表示每个任务的开始时间(startTime ) ,结束时间 (endTime ) ,并行度 (parallelism)
输出描述
一个整数,表示最少需要的服务器数量
示例1
输入
5
0 5 1
2 3 1
3 6 2
4 11 3
6 9 2
输出
7
说明
第6个时刻需要2+3+2=7个
备注 1 <= taskNum <= 100000 0 <= startTime < endTime <=50000 1 <= parallelism <= 100
解题思路
思路好了很简单,定义个数组记录每个时刻所需的任务量,然后获取这个数组的最大任务量即可
代码
package com.example.demo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @Desc: 最大化控制资源成本
* @Auther:chenLing
* @Date: 2024/7/18 11:49
*/
public class Test25 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = Integer.parseInt(sc.nextLine());
List<int[]> list = new ArrayList<>();
int end = 0;
// 收集任务,确认最晚的结束时间
for (int i = 0; i < size; i++) {
int[] s = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
list.add(s);
end = Math.max(end, s[1]);
}
// 定义时间数组,每个时刻的值为对应的任务量
int[] times = new int[end + 1];
int index = 0;
for (int[] task : list) {
// 从任务的开始时间 到 结束时间,每个时刻加上需要的任务量
index = task[0];
while (index <= task[1]) {
times[index] = times[index] + task[2];
index++;
}
}
System.out.println(Arrays.stream(times).max().getAsInt());
}
}