給定一個整數陣列piles,代表有n堆香蕉,piles[i]代表該堆的香蕉數量,守衛h個小時候會回來,請問koko要吃多快才能在守衛回來之前吃完全部。

koko每小時吃的速度最快只需要piles當中最多香蕉的那堆,最慢為1,每次都用middle_speed去計算要花多少時間能吃完全部香蕉,如果大於h,代表這個速度無法在時間h內吃完,因此要加快速度,將最慢的速度設為middle_speed + 1; 如果小於h,代表這個速度能夠在時間h內吃完,因此無須再加快,只須找出最慢可以多慢,將最快的速度設為middle_speed。
int hours_need(int *piles, int pilesSize, int speed){
int hours = 0;
for(int i = 0; i < pilesSize; i++){
hours += piles[i] / speed;
if(piles[i] % speed){
hours++;
}
}
return hours;
}
int minEatingSpeed(int* piles, int pilesSize, int h) {
int All_bananas = 0;
int slowest_speed = 1;
int fast_speed = 0;
for(int i = 0; i < pilesSize; i++){
if(piles[i] > fast_speed) fast_speed = piles[i];
}
while(slowest_speed < fast_speed){
int middle_speed = slowest_speed + (fast_speed - slowest_speed) / 2;
if(hours_need(piles, pilesSize, middle_speed) > h){
slowest_speed = middle_speed + 1;
}
else{
fast_speed = middle_speed;
}
}
return slowest_speed;
}