关注我,笔试编程题无忧,Java笔试之每日一题,提升自己:
题目:输入长度为N的数组Arr以及时间h,Arr代表N堆香蕉,Arr[i]则代表第i堆的香蕉数量,求最少每小时吃多少根,才能在规定时间吃完。要求:如果吃的速度为K,则最多吃K根,多余的下一个小时再吃,同时,如果该堆的数量小于K,也要等到下一小时才能吃下一堆。
分析:本题为二分算法的变形,即速度K的范围为1-max(Arr)。
public int minSpeed(int[] arr , int h){
//求数组中最大值
int l = 1;
int r = arrMax(arr)+1;
while(l < r){
int mid = l + (r-l)/2;
if(canFinish(arr,mid,h){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
public int arrMax(int[] arr){
int max = 0;
for(int i:arr){
if(i>max) max = i;
}
return max;
}
public boolean canFinish(int[]arr,int s,int h){
int time= 0;
int yu = 0;
for(int i:arr){
yu = i%s > 0 ?1:0;
time = (i/s)+yu +time;
}
return time <= h;
}