题解 | #牛奶供应问题#
牛奶供应问题
https://www.nowcoder.com/practice/8c66c9b7deea496193e609b70f39783d
看了好几次才读懂题,如示例1[3, 2, 4, 1, 5],3 ; 这个可以将capacity看作3个执行流,每次可以同时执行3个;比如第一次 3 2 4,同时执行2个任务后为1 0 2,将2保存下来,然后向后遍历taskDurations数组,加入1,即为1 1 2,同时减1 -> 0 0 1,将1记下来,加入5,即为5 0 1,最后完成任务为5;2 + 1 + 5 = 8。
题目分析:用一个数组v表示执行流,然后找v中的最小值和最小值的下标(也就是最先完成的执行流),然后遍历animalTaskScheduler数组,最后找出v中最大值即可。当某时v中有好几个0时,这时也不需要关心,因为找到0,times+0=times,时间是不变的。思路简单,效率不高。
#include <climits> #include <ctime> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param taskDurations int整型vector * @param capacity int整型 * @return int整型 */ int animalTaskScheduler(vector<int>& taskDurations, int capacity) { // write code here int times = 0; vector<int> v(capacity); for (int i = 0; i < taskDurations.size(); ++i) { int k = 0, small = INT_MAX; //k记录最小下标,small记录同时执行任务的最小值 for (int j = 0; j < capacity; ++j) { if (v[j] < small) { small = v[j]; k = j; } } times += small; for (auto& x : v) //执行的每个任务减去small x -= small; v[k] = taskDurations[i]; } //找出v中最大值 int mx = -1; for (auto& x : v) mx = max(mx, x); times += mx; return times; } };