题解 | #牛奶供应问题#

牛奶供应问题

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;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务