• 华为OD机考算法题:高效的任务规划


    题目部分

    题目高效的任务规划
    难度
    题目说明

    你有 n 台机器编号为 1 ~ n,每台都需要完成一项工作, 机器经过配置后都能独立完成一项工作。 假设第 台机器你需要花 B_{i} 分钟进行设置, 然后开始运行, J_{i} 分钟后完成任务。 现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。 注意,不能同时对两台进行配置, 但配置完成的机器们可以同时执行他们各自的工作。

    输入描述第一行输入代表总共有 M 组任务数据(1 < M <= 10)。
    每组数第一行为一个整数指定机器的数量 N (0 < N <= 1000)。 随后的 N 行每行两个整数,第一个表示 B (0 <= B <= 10000), 第二个表示 J (0 <= J <= 10000)。
    每组数据连续输入,不会用空行分割,各组任务单独计时。
    输出描述对于每组任务,输出最短完成时间, 且每组的结果独占一行。 例如两组任务就应该有两行输出。
    补充说明
    ------------------------------------------------------
    示例
    示例1
    输入1
    1
    2 2
    输出4
    说明输出共 3 行数据,第 1 行代表只有 1 组数据;第 2 行代表本组任务只有 1 台机器;第 3 行代表本机器:配置需要 2 分钟,执行需要 2 分钟。输出 1 行数据,代表执行结果为 4 分钟。 
    示例2
    输入2
    2
    1 1
    2 2
    3
    1 1
    2 2
    3 3 
    输出4
    7
    说明第一行代表输入共 2 组数据, 2 - 4 行代表第一组数据,为 2 台机器的配置、执行信息(第 1 台机器:配置需要 1 分钟,执行需要 1 分钟;第 2 台机器:配置需要 2 分钟,执行需要 2 分钟)。5 - 8 行代表第二组数据,为 3 台机器的配置、执行信息(意义同上)。输出共 2 行,分别代表第 1 组任务共需要 4 分钟和第 2 组任务需要 7 分钟(先配置 3,在配置 2,最后配置 1,执行 1 分钟,共 7 分钟)。


    解读与分析

    题目解读

    每台机器只有配置了才能执行。而在同一个时间段只能执行一台机器的配置(配置串行执行),在配置完成后,任务即可执行。
    求出执行完所有任务的时间。

    分析与思路

    对于每一组数据,可以采取贪心算法,遍历所有的组合情况,求出每种情况所需要的时间,经比较,输出时间最小的数字。

    此算法的时间复杂度为 O(n^{2}),空间复杂度为  O(n^{2})。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 高效的任务规划
    4. *
    5. * @since 2023.10.25
    6. * @version 0.1
    7. * @author Frank
    8. *
    9. */
    10. public class EfficientTaskPlan {
    11. public static void main(String[] args) {
    12. Scanner sc = new Scanner(System.in);
    13. while (sc.hasNext()) {
    14. String input = sc.nextLine();
    15. int groupCnt = Integer.parseInt(input);
    16. int[] outputValues = new int[ groupCnt ];
    17. for( int i = 0; i < groupCnt; i ++ )
    18. {
    19. input = sc.nextLine();
    20. int machineCnt = Integer.parseInt( input );
    21. int [][] taskInfo = new int[machineCnt][2];
    22. for( int j = 0; j < machineCnt; j ++ )
    23. {
    24. input = sc.nextLine();
    25. String[] eachMachineStr = input.split( " " );
    26. int[] eachMachine = new int[2];
    27. eachMachine[0] = Integer.parseInt( eachMachineStr[0] );
    28. eachMachine[1] = Integer.parseInt( eachMachineStr[1] );
    29. taskInfo[j] = eachMachine;
    30. }
    31. int[] usedFlag = new int[taskInfo.length];
    32. for( int j = 0; j < usedFlag.length; j ++ )
    33. {
    34. usedFlag[j] = 0;
    35. }
    36. outputValues[i] = caculateEachGroupTaskPlan( usedFlag, taskInfo, 0 );
    37. }
    38. for( int i = 0; i < groupCnt; i ++ )
    39. {
    40. System.out.println( outputValues[i] );
    41. }
    42. }
    43. }
    44. private static int caculateEachGroupTaskPlan( int[] usedFlag, int [][] taskInfo, int curTask ) {
    45. int minTimeTake = Integer.MAX_VALUE;
    46. for( int i = 0; i < taskInfo.length; i ++ )
    47. {
    48. if( usedFlag[i] == 1 )
    49. {
    50. continue;
    51. }
    52. int tmpConfig = taskInfo[i][0];
    53. int tmpTask = taskInfo[i][1];
    54. usedFlag[i] = 1;
    55. int curTimeTake = tmpConfig + caculateEachGroupTaskPlan( usedFlag, taskInfo, tmpTask );
    56. usedFlag[i] = 0;
    57. if( curTimeTake <= curTask )
    58. {
    59. return curTask;
    60. }
    61. if( curTimeTake < minTimeTake )
    62. {
    63. minTimeTake = curTimeTake;
    64. }
    65. }
    66. if( minTimeTake < curTask || minTimeTake == Integer.MAX_VALUE )
    67. {
    68. minTimeTake = curTask;
    69. }
    70. return minTimeTake;
    71. }
    72. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var groupCnt = parseInt(line);
    7. var outputValues = new Array();
    8. for (var i = 0; i < groupCnt; i++) {
    9. line = await readline();
    10. var machineCnt = parseInt(line);
    11. var taskInfo = new Array();
    12. for (var j = 0; j < machineCnt; j++) {
    13. line = await readline();
    14. var eachMachineStr = line.split(" ");
    15. var eachMachine = new Array();
    16. eachMachine[0] = parseInt(eachMachineStr[0]);
    17. eachMachine[1] = parseInt(eachMachineStr[1]);
    18. taskInfo[j] = eachMachine;
    19. }
    20. var usedFlag = new Array();
    21. for (var j = 0; j < groupCnt; j++) {
    22. usedFlag[j] = 0;
    23. }
    24. outputValues[i] = caculateEachGroupTaskPlan(usedFlag, taskInfo, 0);
    25. }
    26. for (var i = 0; i < groupCnt; i++) {
    27. console.log(outputValues[i]);
    28. }
    29. }
    30. }();
    31. function caculateEachGroupTaskPlan(usedFlag, taskInfo, curTask) {
    32. var minTimeTake = Number.MAX_VALUE;
    33. for (var i = 0; i < taskInfo.length; i++) {
    34. if (usedFlag[i] == 1) {
    35. continue;
    36. }
    37. var tmpConfig = taskInfo[i][0];
    38. var tmpTask = taskInfo[i][1];
    39. usedFlag[i] = 1;
    40. var curTimeTake = tmpConfig + caculateEachGroupTaskPlan(usedFlag, taskInfo, tmpTask);
    41. usedFlag[i] = 0;
    42. if (curTimeTake <= curTask) {
    43. return curTask;
    44. }
    45. if (curTimeTake < minTimeTake) {
    46. minTimeTake = curTimeTake;
    47. }
    48. }
    49. if (minTimeTake < curTask || minTimeTake == Number.MAX_VALUE) {
    50. minTimeTake = curTask;
    51. }
    52. return minTimeTake;
    53. }

    (完)

  • 相关阅读:
    Linux 内核模块API之find_module
    Flink / Scala 实战 - 18.一套代码搞懂 KeyedState
    C++ 动态内存管理,new与delete
    学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
    【阅读笔记】《深度学习》第三章:概率与信息论
    mysql基础问题三问(底层逻辑;正在执行;日志观察)
    java毕业设计体育馆预定管理平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    Java项目:ssm赛事打分系统
    Vue编程式路由导航
    伯俊ERP与金蝶云星空对接集成表头表体组合查询打通应收单新增
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/134050225