华为OD机考题目《高效的任务规划》200分题目
题目内容不是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; }
其他语言我也不会写,大家可以自行参考上面思路来实现。
欢迎点赞评论,该贴将会收录到:
中。