华为机试:猴子吃桃

package org.example;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 猴子吃桃
 *
 * @author zey
 * @since 2022-06-12
 */
public class MonkeyEatPeach {

    /*
    猴子吃桃
    题目描述:
    孙悟空喜欢吃蟠桃,一天他乘守卫蟠桃园的天兵天将离开了而偷偷的来到王母娘娘的蟠桃园偷吃蟠桃。
    已知蟠桃园有 N 棵蟠桃树,第 i 棵蟠桃树上有 N[i](大于 0)个蟠桃,天兵天将将在 H(不小于蟠桃树棵数)小时后回来。
    孙悟空可以决定他吃蟠桃的速度 K(单位:个/小时),每个小时他会选择一颗蟠桃树,从中吃掉 K 个蟠桃,如果这棵树上的蟠桃数小于 K,他将吃掉这棵树上所有蟠桃,然后这一小时内不再吃其余蟠桃树上的蟠桃。
    孙悟空喜欢慢慢吃,但仍想在天兵天将回来前将所有蟠桃吃完。
    求孙悟空可以在 H 小时内吃掉所有蟠桃的最小速度 K(K 为整数)。

    输入描述:
    从标准输入中读取一行数字,前面数字表示每棵数上蟠桃个数,最后的数字表示天兵天将将离开的时间。

    输出描述:
    吃掉所有蟠桃的 最小速度 K(K 为整数)或 输入异常时输出 -1。

    示例 1:

    输入
    3 11 6 7 8
    输出
    4
    说明:
    天兵天将8个小时后回来,孙悟空吃掉所有蟠桃的最小速度4。

    第1小时全部吃完第一棵树,吃3个,
    第2小时吃4个,第二棵树剩7个,
    第3小时吃4个,第二棵树剩3个,
    第4小时吃3个,第二棵树吃完,
    第5小时吃4个,第三棵树剩2个,
    第6小时吃2个,第三棵树吃完,
    第7小时吃4个,第4棵树剩3个,
    第8小时吃3个,第4棵树吃完。
    思路分析
    */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String[] argArr = input.nextLine().split(" ");
        int length = argArr.length;
        int hour = Integer.parseInt(argArr[length - 1]);

        List<Integer> peachList = new ArrayList<>();
        for (int i = 0; i < argArr.length - 1; i++) {
            peachList.add(Integer.valueOf(argArr[i]));
        }
        peachList.sort(Integer::compareTo);

        int left = 1;
        int right = peachList.get(peachList.size() - 1);
        while (left < right) {
            int mid = (left + right) / 2;
            if (timeEnough(peachList, hour, mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        System.err.println(left);
    }

    private static boolean timeEnough(List<Integer> peachList, int hour, int speed) {
        int count = 0;
        for (Integer num : peachList) {
            count = count + (num / speed) + (num % speed == 0 ? 0 : 1);
        }
        return count <= hour;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值