画匠问题
来源:互联网 发布:谭铁牛 人工智能 编辑:程序博客网 时间:2024/05/18 03:38
【题目】
给定整型数组arr,元素表示完成一幅画需要的时间,
给定整数num,表示画匠数,
每个画匠只能画连在一起的画作,所有画匠并行工作,
返回所有完成画作所需要的最少时间。
【例子】
public class demo { public static void main(String[] args) { int[] arr=new int[]{3,1,4}; System.out.println(Solution(arr,2));//4,第一个画匠画3和1,第二个画4,最少需要4 int[] arr1=new int[]{1,1,1,4,3}; System.out.println(Solution(arr1,3));//4,第一个画匠画111,第二个画4,第三个画3,最少需要4 }
【代码】
//画匠问题 //确定需要的画匠数(规定每个画匠画画的时间不能多于limit) public static int getNeedNum(int[] arr,int limit){ int res=1;//画匠数 int stepSum=0; for(int i=0;i<arr.length;i++){ if(arr[i]>limit){//某幅画工作量已经大于limit,退出该方法,调整limit return Integer.MAX_VALUE; } stepSum+=arr[i];//同一个画匠的工作量累加 if(stepSum>limit){//直到超过limit,则当前的画应分给下一个画匠 res++;//画匠数加一 stepSum=arr[i];//重新开始累加工作量 } } return res; } public static int Solution(int[] arr,int num){ if(arr==null||arr.length==0||num<1){ throw new RuntimeException("err"); } if(arr.length<num){//arr=[2,3],num=3,直接返回最大的arr[i],即每个画匠画一幅 int max=Integer.MIN_VALUE; for(int i=0;i<arr.length;i++){ max=Math.max(max, arr[i]); } return max; } int minSum=0; int maxSum=0; for(int i=0;i<arr.length;i++){ maxSum+=arr[i];//完成所有画作的时间 } while(minSum!=maxSum-1){//二分查找法,比较需要的画匠数和num,调整limit int mid=(minSum+maxSum)/2; if(getNeedNum(arr,mid)>num){ //需要的画匠数多了,说明mid小了,增大min minSum=mid; } else{ maxSum=mid;//mid大了,减小max } } return maxSum; }
阅读全文
0 0
- 画匠问题
- 其他题目---画匠问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题???
- JavaScript基础(13.Dom内容文本操作)
- Android24.2.0支持库中的SnapHelper学习和使用
- JAVA作业
- python 创建 删除文件夹 合并文件夹内文件
- Spring实现分布式事务JTA(使用atomiko实现)
- 画匠问题
- SystemTap(一)
- ROS相机数据转LaserScan
- 欢迎使用CSDN-markdown编辑器
- C#对象的浅拷贝、序列化深拷贝
- csv文件中的数据导入到oracle数据库中的sqlldr 和 pl/sql 的Text Importer方法
- 就这样一不小心,Python就火了
- promise基础
- 三种 mongodb 的驱动库的对比