题目描述
给定一个整型数组arr, 数组中的每个值都为正数,表示完成一个工作需要的时间,再给定一个整数num,表示工人的数量,每个工人只能完成连在一起的工作。所有工人并行工作,请返回完成所有的工作的最少时间。
本题的问题可以理解为给定一个数组arr[] 将其尽可能的等分为k份,其中每一份中的最大值的最小值是多少?
测试用例
输入
3 2
3 1 4
输出
4
说明: 划分为[3 1]、[4]
输入
5 3
1 1 1 4 3
输出
4
说明:划分为[1 1 1]、[4]、[3]
本题思路
最终所求是完成工作最多的那个工人的工作时长,问题需要使得这个时长尽可能小,即数组尽可能的均匀分配
设定每个工人的工作时长限制为limit 如果limit=sum 那么只需要一个工人就可以完成所有工作 如果limit=0 那么无法完成
因此可以划分为一个二分的思路,即存在这样一个人均工作时长(均分每部分的上限),使得完成arr[]所有工作,恰好k个工人能完成,这里恰好的意思是:即不会出现工人空闲的情况(之前人完成了),也不会出现后面部分工作没有完成(每个人工作量太小)。
关键函数
该函数返回每个人工作上限limit 完成所有工作需要的工人数量
int get_min(vector<long long>& arr,long long limit) //每个人工作时长不超过limit 完成arr 至少需要多少人
{
int len=arr.size();
int count=</