执行时长
题目描述
为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。
假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。
输入描述
- 第一个参数为GPU一次最多执行的任务个数,取值范围[1, 10000]
- 第二个参数为任务数组长度,取值范围[1, 10000]
- 第三个参数为任务数组,数字范围[1, 10000]
输出描述
- 执行完所有任务最少需要多少秒。
用例
输入 | 3 |
输出 | 6 |
说明 | 一次最多执行3个任务,最少耗时6s |
输入 | 4 |
输出 | 5 |
说明 | 一次最多执行4个任务,最少耗时5s |
解析
这个题目重在理解题,理解后可以使用递归进行问题解决
例如下图 可以增强对这个题的执行过程理解
示例代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class T {
static List<Integer> taskList = new ArrayList<Integer>();
static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int gpu = Integer.parseInt(sc.nextLine());
int taskNum = Integer.parseInt(sc.nextLine());
String strTask = sc.nextLine();
for (String item : strTask.split(" ")) {
taskList.add(Integer.parseInt(item));
}
deal(gpu, 0);
System.out.println(count);
}
public static void deal(int gpu, int toDeal) {
if (taskList.size() == 0 && toDeal == 0) {
return;
}
if (taskList.size() == 0) {
count++;
if (gpu < toDeal) {
toDeal = toDeal - gpu;
deal(gpu, toDeal);
}
} else if (toDeal > 0) {
count++;
toDeal = taskList.get(0) + toDeal - gpu;
if (toDeal < 0) {
toDeal = 0;
}
taskList.remove(0);
deal(gpu, toDeal);
} else if (toDeal == 0) {
toDeal = taskList.get(0) - gpu < 0 ? 0 : taskList.get(0) - gpu;
count++;
taskList.remove(0);
deal(gpu, toDeal);
}
}
}
运行示例