最少需要准备多少香蕉,能保证所有猴子都能吃饱

2023-10-08 11:40

本文主要是介绍最少需要准备多少香蕉,能保证所有猴子都能吃饱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

动物园有猴山,每天需要给猴子们发香蕉,猴子会排队依次取食。猴子们铺张浪费,会多拿食物,但最多不会拿超过自身食量的二倍且不会超过当前还存在的香蕉的一半,最后—个猴子除外(即最后—个猴子可以拿完剩余的所有香蕉)。
最少需要准备多少香蕉,能保证所有猴子都能吃饱?

解题思路

先考虑只有一个猴子的情况,那么最少需要的香蕉数量即为这个猴子的食量

如果有3个猴子,那么先让第一个猴子拿香蕉,假设它的食量为4,它最多可能拿8个香蕉,最少可能拿4个香蕉,因为题目是要求最少需要准备多少香蕉,我们假设这个猴子知足常乐,只拿了4个香蕉,但是又有要求猴子拿的香蕉不会超过当前还存在的香蕉的一半,那么我们就给它准备8个香蕉,它只拿 了4个,还剩下4个

接下来喂第二个猴子,如果它的食量为3,那么它只拿3个就能吃饱了,但是拿了3个之后就只剩下1个香蕉了,不满足猴子拿的香蕉不会超过当前还存在的香蕉的一半,那么我们在喂第2个猴子的时候就再加入2个香蕉就可以了,假设它也知足常乐,现在一共剩6个香蕉,它拿了3个,还剩下3个香蕉

接下来喂第三个猴子,如果它的食量为3或者,那么它只拿3个就能吃饱了,就不用再加香蕉了
那么喂第一个猴子准备了8个香蕉,喂第二个猴子准备了2个香蕉,喂第三个猴子准备了0个香蕉.最少需要准备的香蕉数量为 8+2+0=10

输入:[4,3,3]
输出:10

现在假设第3个猴子的食量为5,但是现在只剩下3个香蕉了,我们再加2个香蕉就可以让它吃饱了
那么喂第一个猴子准备了8个香蕉,喂第二个猴子准备了2个香蕉,喂第三个猴子准备了2个香蕉.最少需要准备的香蕉数量为 8+2+2=12

输入:[4,3,5]
输出:12

总结:我们一个一个地喂猴子,把每一次需要加入的香蕉数量用一个数组存起来,最后把数组元素相加就可以了,同时我们需要用另一个数组记录每一次喂完之后剩余的香蕉数(节约空间,也可以用变量), 当当前猴子的2倍食量小于等于当前剩余的香蕉数时,需要加入的香蕉数量为0,当当前猴子的2倍食量大于当前剩余的香蕉数时,需要加入的香蕉数量为2倍食量减当前剩余的香蕉数量

动态方程式

for (int i = 1; i < arr.length - 1; i++) {if (2*arr[i] <= dp_remain[i-1]) {dp[i] = 0;dp_remain[i]=dp_remain[i-1]-arr[i];} else {dp[i] = 2 * arr[i] - dp_remain[i-1];dp_remain[i]=dp_remain[i-1]+dp[i]-arr[i];}}

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

代码实现

/*** Created by 此生辽阔 on 2021/3/21 10:50*/
public class Monkey {public static void main(String[] args) {// int []arr={3,5,4,2};int []arr={5,4,6,2,3,1,9};solutionMokey solutionMokey = new solutionMokey();System.out.println(solutionMokey.minBanana(arr));}}
class solutionMokey{int minBanana(int arr[]) {int[] dp = new int[arr.length];//每一次需要加入的香蕉数量int [] dp_remain=new int[arr.length];//每一次喂完剩余的香蕉数量if(arr.length==1)//考虑只有一个猴子的情况{return arr[0];}dp[0] = 2 * arr[0];//当有多个猴子,初始化dpdp_remain[0]=arr[0];//当有多个猴子,初始化 dp_remainfor (int i = 1; i < arr.length - 1; i++) {//计算第2个到第n-1个猴子的投喂情况if (2*arr[i] <= dp_remain[i-1]) {dp[i] = 0;dp_remain[i]=dp_remain[i-1]-arr[i];} else {dp[i] = 2 * arr[i] - dp_remain[i-1];dp_remain[i]=dp_remain[i-1]+dp[i]-arr[i];}}if(arr.length-1>=0&&arr.length-2>=0)//考虑数组越界{if(arr[arr.length-1]>dp_remain[arr.length-2])//计算最后一个猴子的投喂情况{dp[arr.length-1]=arr[arr.length-1]-dp_remain[arr.length-2];}else{dp[arr.length-1]=0;}}int sum=0;for(int j=0;j<=dp.length-1;j++)//dp数组求和,计算最少需要投喂的香蕉数量{System.out.print(dp[j]+" ");sum=sum+dp[j];}System.out.println();return sum;}

结果展示

在这里插入图片描述

代码实现2

为了结约空间,每一次需要加入的香蕉数量和每一次喂完剩余的香蕉数量都可以用变量来表示,同时用sum来记录香蕉总数

package nowcoder;/*** Created by 此生辽阔 on 2021/3/21 10:50*/
public class Monkey {public static void main(String[] args) {// int []arr={3,5,4,2};int []arr={5,4,6,2,3,1,9};solutionMokey solutionMokey = new solutionMokey();System.out.println(solutionMokey.minBanana(arr));}}
class solutionMokey{int minBanana(int arr[]) {int dp = 0;//每一次需要加入的香蕉数量int  dp_remain=0;//每一次喂完剩余的香蕉数量int sum=0;//香蕉总数if(arr.length==1)//考虑只有一个猴子的情况{return arr[0];}dp = 2 * arr[0];//当有多个猴子,初始化dpsum=sum+dp;// dp_remain[0]=arr[0];//当有多个猴子,初始化 dp_remaindp_remain=arr[0];for (int i = 1; i < arr.length - 1; i++) {//计算第2个到第n-1个猴子的投喂情况if (2*arr[i] <= dp_remain) {dp = 0;dp_remain=dp_remain-arr[i];} else {dp = 2 * arr[i] - dp_remain;dp_remain=dp_remain+dp-arr[i];}sum=sum+dp;}if(arr.length-1>=0&&arr.length-2>=0)//考虑数组越界{if(arr[arr.length-1]>dp_remain)//计算最后一个猴子的投喂情况{dp=arr[arr.length-1]-dp_remain;}else{dp=0;}sum=sum+dp;}return sum;}
}

结果展示

在这里插入图片描述

声明:仅代表我个人的解题思路,我只有题目,没有解题方法和标准答案,不知道我的思路是否正确,本文仅供参考,欢迎在评论区留言交流

这篇关于最少需要准备多少香蕉,能保证所有猴子都能吃饱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/165016

相关文章

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多