前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
孙悟空来到了蟠桃园偷吃蟠桃。蟠桃园有N棵桃树,每棵树上都有一定数量的蟠桃。守卫将在H小时后回来。
孙悟空每小时可以选择吃一棵树上的所有蟠桃(如果数量少于他选择的速度,则全部吃掉),并且在这一个小时内不会吃其他树上的桃子。
孙悟空希望以尽可能慢的速度吃蟠桃,但又要确保在守卫回来之前吃完所有的桃子。
题目要求计算孙悟空能在H小时内吃完所有桃子的最小速度K(个/小时),如果以任何速度都吃不完,则返回0。
输入
第一行输入为N个数字,表示桃树的数量,接下来是N个数字,用空格分隔,表示每棵桃树上蟠桃的数量。
第二行输入为一个数字H,表示守卫离开的时间(小时)。
输出
输出一个整数,表示孙悟空能在H小时内吃完所有桃子的最小速度K。如果以任何速度都吃不完,则输出0。
示例
样例1
输入
2 3 4 5
4
输出
5
解析:对于样例1,孙悟空以每小时吃5个蟠桃的速度,可以在4小时内吃完所有蟠桃,这是最小的可行速度。
样例2
输入
2 3 4 5
3
输出
0
解析:即使孙悟空以最快速度吃桃,也无法在3小时内吃完所有蟠桃,因此输出0。
样例3
输入
30 11 23 4 20
6
输出
23
解析:孙悟空需要以每小时至少吃23个蟠桃的速度,才能在6小时内吃完所有蟠桃。
解题思路
- 当给定小时数小于桃树棵树,无论如何也吃不完;
- 当给定小时数等于桃树棵树,取树上桃子最多的数目为速度;
- 当给定小时数大于桃树棵树,从速度1开始计算时间,直到所得时间大于给定时间为止,这时其前一个速度就是满足条件的最小速度;
题解
java实现
package huawei.e100;import java.util.Arrays;
import java.util.Scanner;/**
* @author arnold
* @date 2024年12月10日
*
*/
public class T10 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()) {String line = sc.nextLine();if (line.equals("")) {line = sc.nextLine();}String[] tmp = line.split(" ");int[] trees = new int[tmp.length];for (int i = 0; i< tmp.length; i++) {trees[i] = Integer.parseInt(tmp[i]);}int h = sc.nextInt();int maxnum = Arrays.stream(trees).max().getAsInt();if (trees.length > h) {System.out.println(0);} else if (trees.length == h) {System.out.println(maxnum);} else {int res = run(trees, h);System.out.println(res);}}}private static int run(int[] trees, int h) {// 从小向大去找int speed = 1;int time = Integer.MAX_VALUE;while (time > h) {time = 0;for (int i = 0; i< trees.length; i++) {time += usedTime(trees[i], speed);if(time > h) {break;}}speed++;}return speed-1;}static int usedTime(int num, int speed) {int usedTime = 0;if(num > speed) {int t = num/speed;usedTime = num%speed ==0 ? t : (t +1);} else {usedTime = 1;}return usedTime;}}