执行时长 - 华为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 广东

相关推荐

评论
3
5
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4381次浏览 77人参与
# AI面会问哪些问题? #
28254次浏览 566人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15394次浏览 223人参与
# 你的实习产出是真实的还是包装的? #
20395次浏览 343人参与
# 找AI工作可以去哪些公司? #
9367次浏览 248人参与
# 春招至今,你的战绩如何? #
66293次浏览 585人参与
# 厦门银行科技岗值不值得投 #
8102次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
9204次浏览 322人参与
# 中国电信笔试 #
32078次浏览 295人参与
# 你做过最难的笔试是哪家公司 #
34361次浏览 246人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340972次浏览 2175人参与
# 哪些公司真双非友好? #
69702次浏览 289人参与
# 阿里笔试 #
179029次浏览 1318人参与
# 机械人避雷的岗位/公司 #
62709次浏览 393人参与
# 小马智行求职进展汇总 #
25140次浏览 80人参与
# 第一份工作一定要去大厂吗 #
14907次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22250次浏览 284人参与
# 担心入职之后被发现很菜怎么办 #
291382次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26283次浏览 310人参与
# 应届生第一份工资要多少合适 #
20694次浏览 86人参与
# HR最不可信的一句话是__ #
6352次浏览 114人参与
# 沪漂/北漂你觉得哪个更苦? #
10045次浏览 194人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务