最大化控制资源成本 - 华为OD统一考试

OD统一考试

题解: Java / Python / C++

alt

题目描述

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

输入描述

第一行输入为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

题解

差分数组

解题思路:

使用差分数组的思想,创建一个数组 d 来记录每个时间点的服务器占用情况。遍历每个任务,将其开始时间和结束时间对应的数组元素进行累加和累减,表示服务器的占用情况。在遍历的过程中,记录累加和的最大值,即为需要的最大服务器数量。

Java

import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int taskNum = scanner.nextInt();
        
        // 差分数组
        final int N = 50000 + 5;
        int[] d = new int[N];

        int startTime, endTime, parallelism;
        for (int i = 0; i < taskNum; i++) {
            startTime = scanner.nextInt();
            endTime = scanner.nextInt();
            parallelism = scanner.nextInt();
            d[startTime] += parallelism;
            d[endTime] -= parallelism;
        }

        int result = 0;
        int sum = 0;
        for (int i = 0; i < N; i++) {
            // sum 表示的是 i 时间,执行所有任务所需服务器数量
            sum += d[i];
            result = Math.max(result, sum);
        }

        System.out.println(result);
    }
}

Python

task_num = int(input())
# 差分数组
N = 50000 + 5
d = [0] * N

for _ in range(task_num):
    start_time, end_time, parallelism = map(int, input().split())
    d[start_time] += parallelism
    d[end_time] -= parallelism

result = 0
sum_value = 0
for i in range(N):
    # sum_value 表示在 i 时间,执行所有任务所需服务器数量
    sum_value += d[i]
    result = max(result, sum_value)

print(result)

C++

#include <vector>
#include <algorithm>
#include <iostream>

#define N 50000 + 5

using namespace std;

int main() {
    int taskNum;
    cin >> taskNum;
    // 差分数组
    vector<int> d(N);

    int startTime,endTime,parallelism;
    for(int i=0; i<taskNum; i++) {
        cin >> startTime >> endTime >> parallelism;
        d[startTime] += parallelism;
        d[endTime] -= parallelism;
    }

    int result = 0;
    for(int i=0, sum = 0; i<N; i++) {
        // sum 表示的是 i 时间,执行所有任务所需服务器数量
        sum += d[i];
        result = max(result, sum);
    }

    cout << result << endl;


    return 0;
}

(差分数组)相关练习题

alt

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#校招##秋招##面经##华为##面试#
全部评论
相关练习题被和谐,看不到啦
点赞 回复 分享
发布于 2023-12-26 12:07 湖北

相关推荐

机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
6
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务