如何用java解决某动物园的猩猩“小黑子”很喜欢吃香蕉,但是香蕉有警卫看守,“小黑子”不能吃到香蕉会很伤心,当警卫离开时它可以偷偷吃到香蕉。这里有 n 堆香蕉,每一堆的香蕉数量不详。此时警卫已经离开了,将在 h 小时后回来。“小黑子”可以决定自己吃香蕉的速度 k (单位:根/小时)。每过一个小时,它将会另选一堆香蕉,并从中吃掉 k 根。如果这堆香蕉少于 k 根,它将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 “小黑子”喜欢细嚼慢咽,但仍然想在警卫回来前吃掉所有的香蕉。返回它可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数),如果吃不完则输出“不可能吃完”。
时间: 2023-02-05 07:08:29 浏览: 60
你可以这样来解决这个问题:
1. 定义一个方法,其中包含三个参数:整数 n 和 h(表示香蕉的堆数和警卫离开的时间)以及一个数组 a(表示每堆香蕉的数量)。
2. 使用一个循环,从小到大枚举每个可能的 k 值。
3. 使用另一个循环,从第一堆香蕉开始,每过一个小时就吃掉 k 根香蕉。如果当前堆香蕉数量小于 k,就吃掉这堆所有的香蕉。
4. 如果在警卫回来前吃完了所有的香蕉,就返回当前的 k 值。否则,继续枚举下一个 k 值。
5. 如果循环结束后没有合适的 k 值,就输出“不可能吃完”。
示例代码:
```
public int eatBananas(int n, int h, int[] a) {
// 从小到大枚举 k 值
for (int k = 1; k <= 100; k++) {
int time = 0; // 用于记录已经吃了多长时间
// 从第一堆香蕉开始,每过一个小时就吃掉 k 根香蕉
for (int i = 0; i < n; i++) {
time++; // 已经吃了一个小时
if (time > h) { // 警卫回来了,无法吃完所有的香蕉
break;
}
if (a[i] <= k) { // 当前堆香蕉数量小于 k,
相关问题
如何用java二分法解决某动物园的猩猩“小黑子”很喜欢吃香蕉,但是香蕉有警卫看守,“小黑子”不能吃到香蕉会很伤心,当警卫离开时它可以偷偷吃到香蕉。这里有 n 堆香蕉,每一堆的香蕉数量不详。此时警卫已经离开了,将在 h 小时后回来。“小黑子”可以决定自己吃香蕉的速度 k (单位:根/小时)。每过一个小时,它将会另选一堆香蕉,并从中吃掉 k 根。如果这堆香蕉少于 k 根,它将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 “小黑子”喜欢细嚼慢咽,但仍然想在警卫回来前吃掉所有的香蕉。返回它可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数),如果吃不完则输出“不可能吃完”。
在这道题中,我们可以使用二分法来解决。
首先,定义一个方法来判断是否能在 h 小时内吃掉所有的香蕉。我们将二分法的中间值设为 k,然后遍历每一堆香蕉,计算出需要的时间。如果总时间大于 h,则说明 k 值太小,我们需要增大 k 的值。反之,如果总时间小于等于 h,则说明 k 值可以满足条件,我们需要减小 k 的值。
代码如下:
```
public int minEatingSpeed(int[] piles, int h) {
int left = 1;
int right = 0;
for (int pile : piles) {
right = Math.max(right, pile);
}
while (left < right) {
int mid = left + (right - left) / 2;
int time = 0;
for (int pile : piles) {
time += (pile + mid - 1) / mid;
}
if (time > h) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
```
在上面的代码中,我们首先将二分法的左端点设为 1,右端点设为最大的香蕉数。然后我们在 while 循环中使用二分法的常规操作,计算出中间值 mid,并遍历每一堆香蕉,计算出需要的时间。如果总时间大于 h,则说明 k 值太小,我们需要增大 k 的值。反之,如果总时间小于等于 h,则说明 k 值可以满足条件,我们
java动物园类的多态
在Java中,多态是面向对象编程的一个核心概念,它允许不同类型的对象对同一消息做出响应。Java动物园类通常涉及到继承和接口,以展示多态性。
1. **继承多态**:如果一个类(如`Animal`)是另一个类(如`Mammal`或`Bird`)的子类,那么`Animal`类型的引用可以指向`Mammal`或`Bird`类型的实例。当你通过这个引用调用某个方法(例如`makeSound()`)时,子类会覆盖父类的方法,实现自己的行为,这就是编译时多态。
2. **方法重写(Overriding)**:在子类中,可以定义与父类同名但参数列表、返回类型或访问级别不同的方法,这称为方法重写。当调用这个方法时,会根据实际的对象类型执行对应子类的方法。
3. **接口多态**:Java接口中的方法默认都是抽象的(没有实现),所以实现接口的类必须提供这些方法的实现。当创建接口类型的引用并指向实现了该接口的类时,也可以表现出多态性。
4. **向上转型(Upcasting)**:你可以将子类类型的引用赋值给父类类型的引用,这样在调用方法时,实际上是调用了子类的方法,这也是多态的一种体现。
**相关问题--:**
1. Java中如何通过父类引用调用子类的重写方法?
2. 接口多态和继承多态有什么区别?
3. Java的向上转型和向下转型分别是什么?
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)