华为OD机考题目《高效的任务规划》200分题目



在百度文库上 看到这么一个题目: https://wenku.baidu.com/view/8e77b3f5270c844769eae009581b6bd97f19bc68.html


题目内容不是VIP不能复制下来。

我就对着他提供的题目,简单写了一下。

首先谈我对题目的理解:

你有N台机器 , 并且有 N个任务。
每个任务 都有 配置时间B 和 执行时间J 两个时间,并且是串行的。 总耗时是 B+J 。
这N台机器,不能同时配置,你只有一个人,你要配置完一个,再配置一个,但配置完之后,它们可以同时执行。
比如  有2台机器, 第一个 配置和执行时间分别是  5, 3 , 第二个是  2, 2
那么 你配置完第一台时, 花了5分钟, 此时 第一台开始执行, 那么同时,你配置第二台,花了2分钟,所以第一台也执行了2分钟了。
然后第二台开始执行, 当第二台执行了1分钟时, 第一台就执行完了。然后第二台继续执行1分钟,就OVER了。
所以总耗时是  5+2+2 = 9 。


如果你反过来配置, 先配置 第二台,花了 2分钟,然后开始配置第二台, 我配了5分钟,此时第一台已经执行完了, 第二台又花了 3分钟执行。
所以总耗时是 2+5+3 = 10。
这样一算,还是第一种配置方式最短,所以输出 9 。

根据这个图,我们可以想象到,首先,我们的配置是顺序配置的,无论谁先、谁后,总时长是一样的。



那么,我只要让执行耗时最长的,先执行,就好了呀,然后取 我上一次记录的最大时间,与 配置时间+本次执行时间  两者最长的那个即可。
为啥取最长? 因为我上一个配置的任务,它的执行时长可能非常长,如下图:

有了这个例子,就应该很清楚地知道为啥取  上一次记录的最大时长 与 配置时间+本次执行时间   两者最大的那个了吧。


对了, 题目中提到,有M组数据, 所以,代码中要能接收 M组数据,并分别对于每一组数据的输入,给出相应的输出。

我的代码是(c++):

int main() {
    int M;
    cin >> M;
    while (M) 
    {
        //一共M组用例,每组用例要输出一个数字。
        M--;
        TaskConfigure();
    }

    return 0;
}

其中,TaskConfigure() 是一个无输入、无输出的函数,它能对每一组数据进行处理,包括 接收输入、计算、打印输出。

void TaskConfigure(void)
{
    int N, b, j;//N表示N个机器,也是N组任务
    cin >> N;
    vector< pair<int,int> > rVec; // pair: <执行时长, 配置时长>
    while (N) 
    {
        N--;
        cin >> b >> j;
        rVec.push_back(pair<int, int>(j,b));
    }
    // 排个序,执行时间大的在前面,执行时间小的在后面,大的最耗时,先统计
    sort(rVec.begin(), rVec.end(), [&](auto &itl, auto& itr) {return itl.first >= itr.first; });

    //同一时间不能配置多个,所以要把配置时间全部加进去得到len
    //既然配置时间是固定的,那么看看哪个执行时间最长,那就是总的最长时间了,得到maxnum
    int len = 0, maxnum = 0;
    for (auto it = rVec.begin(); it != rVec.end(); it++) 
    {
        len += it->second;
        maxnum = max(len + it->first, maxnum);
    }
    cout << maxnum << endl;
}


其他语言我也不会写,大家可以自行参考上面思路来实现。


欢迎点赞评论,该贴将会收录到:


中。

















全部评论
leetcode上的任务调度器?
1 回复 分享
发布于 2022-07-02 03:39
python的实现,有错误欢迎指正
3 回复 分享
发布于 2022-06-22 10:17
import java.util.Arrays; import java.util.Comparator; public class Efficient_mission_planning {     public static void main(String[] args) {         int[][] intervals = {{2, 3}, {2, 9}, {4, 5}, {3, 7}, {6, 7}, {8, 9}, {1, 10}};         sort(intervals);         System.out.println(solution(intervals));     }     //遍历取最大     public static int solution(int[][] intervals) {         int dispose_time = 0;         int maxnum = 0;         for (int i = 0; i < intervals.length; i++) {             dispose_time += intervals[i][0];             maxnum = Math.max(dispose_time + intervals[i][1], maxnum);         }         return maxnum;     }     //排序,执行时间长的排前面     public static void sort(int[][] intervals) {         Arrays.sort(intervals, new Comparator<int[]>() {             @Override             public int compare(int[] o1, int[] o2) {                 return o2[1] - o1[1];             }         });     } }
3 回复 分享
发布于 2022-06-03 07:00
public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int m = sc.nextInt();         for (int mi = 0; mi < m; mi++) {             int n = sc.nextInt();             int[][] BJ = new int[n][2];             for (int i = 0; i < n; i++) {                 BJ[i][0] = sc.nextInt();                 BJ[i][1] = sc.nextInt();             }             int result = minTime(BJ);             System.out.println(result);         }     }     public static int minTime(int[][] BJ) {         int n = BJ.length;         Arrays.sort(BJ, (o1, o2) -> o2[1] - o1[1]);         int configTime = 0; // 表示第i机器开始配置前的所有机器配置的使用         int result = 0;         for (int i = 0; i < n; i++) {             result = Math.max(result, configTime + BJ[i][0] + BJ[i][1]);             configTime += BJ[i][0];         }         return result;     } }
点赞 回复 分享
发布于 2022-06-18 10:28
我想说代码写得挫,不重复的话,是不是也能过
点赞 回复 分享
发布于 2022-06-14 00:00

相关推荐

04-16 12:49
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
评论
6
5
分享

创作者周榜

更多
牛客网
牛客企业服务