华为OD机试 - 执行时长 - 回溯(Java 2023 B卷 100分)-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

二、输入描述

  • 第一个参数为GPU一次最多执行的任务个数,取值范围[1, 10000]
  • 第二个参数为任务数组长度,取值范围[1, 10000]
  • 第三个参数为任务数组,数字范围[1, 10000]

三、输出描述

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

四、解题思路

题目描述很不清晰,感觉语文没学好。

反复读几遍,懂它啥意思了。

1、大概意思就是:

  1. GPU一次可以执行n个任务;
  2. 有一个任务数组,GPU每秒执行n个任务;
  3. 问几秒能执行完。

这不就简单了。

2、比如:

4
3
3 4 5

  1. GPU一次执行4个任务;
  2. 第1秒有3个任务,全部执行完毕;
  3. 第2秒有4个任务,全部执行完毕;
  4. 第3秒有5个任务,执行4个,还剩1个;
  5. 第4秒执行完毕;

故输出4。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {
    static List<Integer> list = new ArrayList<Integer>();
    // 执行完所有任务最少需要多少秒
    static int times = 0;
    static int n = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // GPU一次最多执行的任务个数
        n = Integer.parseInt(sc.nextLine());
        // 任务数组长度
        int size = Integer.parseInt(sc.nextLine());
        // 任务数组
        for (String item : sc.nextLine().split(" ")) {
            list.add(Integer.parseInt(item));
        }
        execute(0);
        System.out.println(times);
    }

    /**
     * 回溯,递归
     * GPU执行任务
     * @param remain 执行后剩余的任务数
     */
    public static void execute(int remain) {
        // 回溯完毕
        if (list.size() == 0 && remain == 0) {
            return;
        }
        // 如果任务数组都执行完了
        if (list.size() == 0) {
            // 但是,还有剩余
            if (n < remain) {
                remain -= n;
                execute(remain);
            }
            // 任务数组未执行完
        } else{
            // 上次有剩余任务
            if (remain > 0) {
                // 取出第一个任务 + 上次的剩余任务 - GPU执行任务数
                remain = list.get(0) + remain - n;
                if (remain < 0) {
                    remain = 0;
                }
                // 任务数组未执行完,上次执行没任务剩余
            } else if (remain == 0) {
                // 执行本次任务,判断是否有剩余
                remain = list.get(0) - n < 0 ? 0 : list.get(0) - n;
            }
            // 删除已经执行完的任务
            list.remove(0);
            execute(remain);
        }
        // 执行时间+1
        times++;
    }
}

六、效果展示

1、输入

3
4
5 4 3 2

2、输出

5

3、说明

  1. GPU一次执行3个任务;
  2. 第1秒有5个任务,执行3个,还剩2个;
  3. 第2秒有4个任务+上次剩余的2个,一共还有6个任务,执行3个,还剩3个;
  4. 第3秒有3个任务+上次剩余的3个,一共还有6个任务,执行3个,还剩3个;
  5. 第4秒有2个任务+上次剩余的3个,一共还有5个任务,执行3个,还剩2个;
  6. 第5秒执行完毕;

故输出5。

华为OD机试 - 执行时长 - 回溯(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试 - 执行时长 - 回溯(Java 2023 B卷 100分)-LMLPHP

08-18 08:50