华为OD题目:任务混部

华为OD题目:任务混部

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

输入描述:
第一行输入为taskNum,表示有taskNum项任务
接下来taskNum行,每行三个整数,表示每个任务的开始时间(startTime),结束时间(endTime),并行度parallelism
输出描述:
一个整数,表示最少需要的服务器数量
补充说明:
1<=taskNum<=100000
0<=startTime<endTime< 50000
1<=parallelism<=100

示例1
输入:
3
2 3 1
6 9 2
0 5 1
输出:
2

说明:
共有三个任务,第一个任务在时间区间[2,3)运行,占用1个服务器,第二个任务在时间区间16.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个服务器。

解题思路:

  • 差分
  • 对组装新
  • (那么了解了差分数列这个特性有什么用呢?
  • 差分数列通常用于 给一个区间所有元素 统统加上 一个增量。)
  • 参考: https://fcqian.blog.csdn.net/article/details/128976936
  • 如果不用差分,就得两层for循环,时间复杂度就是O(n^2);
  • 使用差分的话,O(n)就可以了
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        //差分数组
        int[] arr = new int[50000];

        int maxTime = 0;
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String line = sc.nextLine();
            String[] split = line.split(" ");
            int startTime = Integer.parseInt(split[0]);
            int endTime = Integer.parseInt(split[1]);
            int parallelism = Integer.parseInt(split[2]);
            //循环比较,取最大的时间
            maxTime = Math.max(endTime, maxTime);

            int[] range = {startTime, endTime, parallelism};
            //下面是给差分数组赋值
            arr[startTime] = parallelism;
            arr[endTime] = -parallelism;
        }

        int res = 0;
        int count = 0;
        //遍历,将差分数组的值累加,取最大的一个
        for (int i = 0; i <=maxTime; i++) {
            count += arr[i];
            res = Math.max(res, count);
        }
        System.out.println(res);

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值