猴子搬香蕉(算法入门题目005)

这是一道关于猴子搬运香蕉的算法问题,当猴子每次最多背c只香蕉,每走1里路会吃掉1只,求最多能运多少香蕉到B地。通过分析,发现当c>=w时情况简单,否则需要考虑如何节省。最优解法是让猴子一里一里地运输,并处理好零头问题。代码实现包括初步解法和优化后的解法,该问题旨在练习整数运算和边界条件处理。
摘要由CSDN通过智能技术生成

题目

A 地有一堆香蕉,共 w 只。
一只猴子要把香蕉从 A 地运输到 B 地。
两地相距 s 里。
猴子每次最多只能背 c 只香蕉。
无论背多少香蕉(甚至不背),猴子每走 1 里路,会吃掉 1 只香蕉。
当然,猴子在完成运输任务后,并不需要返回 A 地。
猴子只在整数里程点往返。
求: 在使用最佳策略时,最多能运多少香蕉到 B 地。

比如: w=30, s=3, c=10,
则,最多可运去 17 只香蕉。
考虑一搬性,w s c 都可能很大,比如:
w=987654321, s=32345678, c=10000000
(这只是个数学问题,不要说猴子背不动什么的…)
输入数据保证都是大于 0 的。

分析

首先,如果 c >= w,所有香蕉一次就可运完,则为简单情况。
更多的情况是需要往返运输。则要考虑怎样才节省。
显然,此时,猴子把香蕉一里一里地运输总是最优的。
因此,可得最笨的解法。
使用这种解法要注意一个陷阱,那就是零头的处理问题。
在此基础下,可以分析出哪些步骤可以合并,则得更优解法。

这个问题有 3 个变量,在考虑边界条件的时候要小心一些。
这 3 个变量的地位不一样,在给定一个具体问题时,
c 变成常量,而 w, s 随着求解过程不断变化。

代码

先来个笨的,较可靠的:

//problem005
public class A
{
   
	// 保证输入数据大于0
	static int f(int w, int s, int c){
   
		if(c < 2) return 0;
		if(c == 2){
   
			if(s > 1) return 0;
			if(w < 2) return 0;
			return 1;
		}
		if(w <= s) return 0;
		if(c > w) return w-s;
		
		while(s > 0){
   
			if(w < s) {
   
				w = 0;
				
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值