华为OD 爱吃蟠桃的孙悟空 Java

题目描述

孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵桃树,每颗树上都有桃子,守卫将在 H 小时后回来。

孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉 K 个,如果树上的桃子少于 K 个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。

孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。

请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0。

输入描述

第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每颗桃树上蟠桃的数量。

第二行输入为一个数字,表示守卫离开的时间 H。

其中数字通过空格分割,N、H为正整数,每颗树上都有蟠桃,且 0 < N < 10000,0 < H < 10000。

输出描述

吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。

用例1

输入

2 3 4 5
4

输出

5

用例2

输入

2 3 4 5
3

输出

0

用例3

输入

30 11 23 4 20
6

输出

23

import java.util.Scanner;

import java.util.Arrays;

public class Main {

         public static void main(String[] args) {

                 Scanner in = new Scanner(System.in);

                 String[] strNums = in.nextLine().split(" ");

                 int[] nums = Arrays.stream(strNums).mapToInt(Integer::parseInt).toArray();

                 int period = in.nextInt();

                 int min = 1;

                 int max = 1;

                 for(int num:nums){

                        if(num >= max) max = num;

                 }

                 if(nums.length > period) {System.out.print(0); return;} //桃子吃不完,返回0

                 if(nums.length == period){System.out.print(max); return;} //桃子树和返回时间相同

                System.out.println(getNum(nums, period, min, max));

         }

          public static int getNum(int[]nums, int period, int min, int max){

                  int mid = (min+max)/2;

                  if(mid == min) return max;

                  int size = 0;

                 for(int num: nums){

                       size = (int)Math.ceil((double)num/mid) + size; //计算总耗时

                  }

                if(size > period){

                      min = mid;//总耗时大于守卫回来时间,min=mid,往右继续寻找最优值

                     return getNum(nums, period, min, max);

               }

              if(size <= period){

                    max = mid;  //总耗时小于等于守卫回来时间,max=mid,往左继续寻找最优值

                   return getNum(nums, period, min, max);

              }

            return 0;

       }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值