执行时长 - 华为OD统一考试(D卷)

OD统一考试(D卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。

假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。

输入描述

第一个参数为GPU一次最多执行的任务个数,取值范围[1, 10000]

第二个参数为任务数组长度,取值范围[1, 10000]

第三个参数为任务数组,数字范围[1, 10000]

输出描述

执行完所有任务最少需要多少秒。

示例1

输入:
3
5
1 2 3 4 5

输出:
6

说明:
一次最多执行 3 个任务,最少耗时 6s。

示例2

输入:
4
5
5 4 1 1 1

输出:
5

说明:
一次最多执行 4 个任务,最少耗时 5s。

题解

这个问题可以使用贪心策略来解决。

主要思路是遍历任务数组,每秒执行尽可能多的任务,然后根据剩余任务数量计算等待时间。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 最多一次执行任务数, 任务长度
        int n = scanner.nextInt(), taskLength = scanner.nextInt();

        // 任务列表
        int[] tasks = new int[taskLength];
        for (int i = 0; i < taskLength; i++) {
            tasks[i] = scanner.nextInt();
        }

        // 等待的任务数量
        int waitNum = 0;
        for (int taskNum : tasks) {
            // 每秒最多n个任务,执行不完则等待后续执行
            waitNum = Math.max(0, waitNum + taskNum - n);
        }

        // 计算任务执行完成
        // (waitNum + n - 1) / n  向上取整
        int costTime = taskLength + (waitNum + n - 1) / n;

        System.out.println(costTime);
    }
}


Python

# 最多一次执行任务数
n = int(input())
task_length = int(input())
tasks = list(map(int, input().split()))

# 等待的任务数量
wait_num = 0
for task_num in tasks:
    # 每秒最多n个任务, 执行不完则等待后续执行
    wait_num = max(0, wait_num + task_num - n)

# 计算任务执行完成
# (wait_num + n - 1) // n    向上取整的写法
cost_time = task_length + (wait_num + n - 1) // n
print(cost_time)

C++

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // 最多一次执行任务数, 任务长度
    int n, taskLength;
    cin >> n >> taskLength;

    // 任务列表
    vector<int> tasks(taskLength);
    for (int i = 0; i < taskLength; i++) {
        cin >> tasks[i];
    }

    // 等待的任务数量
    int waitNum = 0;
    for (int taskNum : tasks) {
        // 每秒最多n个任务,执行不完则等待后续执行
        waitNum = max(0, waitNum + taskNum - n);
    }

    // 计算任务执行完成
    int costTime = taskLength + (waitNum + n - 1) / n;

    cout << costTime << endl;

    return 0;
}

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

#面经##春招##秋招##校招##华为#
全部评论
// (waitNum + n - 1) / n 向上取整 int costTime = taskLength + (waitNum + n - 1) / n; + n -1 是什么作用呢? 来个大神说一下呗 没理解,为啥不用 int costTime = taskLength + Math.ceil((double) waitNum / n)
1 回复 分享
发布于 2024-06-08 00:22 北京
我理解不了题目意思,“数组元素表示这1秒内新增的任务个数且每秒都有新增任务”,示例1岂不是每秒总共会新增1+2+3+4+5=15个任务,但是这秒内才执行掉3个任务,这样任务只会越来越多🤣
点赞 回复 分享
发布于 2024-12-25 21:14 广东
每秒钟处理n个任务,每秒都会来一些任务,没想明白下一秒的任务是怎么分配到当前这一秒执行的?
点赞 回复 分享
发布于 2024-06-30 10:29 内蒙古
读懂题目其实也不简单:对于数组中每个元素,若一次执行不完,则将该元素剩余部分抛给下个元素处理
点赞 回复 分享
发布于 2024-06-03 14:25 广东

相关推荐

点赞 评论 收藏
分享
写不来代码的小黑:这么小的城市能有做it的公司也不容易
点赞 评论 收藏
分享
评论
3
5
分享

创作者周榜

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