一个商人骑一头驴要穿越1000公里长的沙漠,去卖3000根胡萝卜。已知驴一次性可驮1000根胡萝卜,但每走1公里又要吃掉1根胡萝卜。

假设出沙漠时有1000根萝卜,那么在出沙漠之前一定不只1000根,那么至少要驮两次才会出沙漠,那样从出发地到沙漠边缘都会有往返的里程,那所走的路程将大于3000公里,故最后能卖出萝卜的数量一定是小于1000根的。
那么在走到某一个位置的时候萝卜的总数会恰好是1000根。因为驴每次最多驮1000,那么为了最大的利用驴,第一次卸下的地点应该是使萝卜的数量为2000的地点。
因为一开始有3000萝卜,驴必须要驮三次,设驴走X公里第一次卸下萝卜则:5X=1000(吃萝卜的数量,也等于所行走的公里数)X=200,也就是说第一次只走200公里。
验算:驴驮1000根走200公里时剩800根,卸下600根,返回出发地前两次就囤积了1200根,第三次不用返回则剩800根,则总共是2000根萝卜了。第二次驴只需要驮两次,设驴走Y公里第二次卸下萝卜则:3Y=1000, Y=333.3
验算:驴驮1000根走333.3公里时剩667根,卸下334根,返回第一次卸萝卜地点第二次在途中会吃掉334根萝卜,到第二次卸萝卜地点是加上卸下的334根,刚好是1000根。而此时总共走了:200+333.3=533.3公里,而剩下的466.7公里只需要吃466根萝卜
所以可以卖萝卜的数量就是1000-466=534。
#include <iostream.h>
#include <math.h>


int main()
{
	int i = 0; //循环变量
	int s = 1000; //总里程
	int n = 3000; //总萝卜数
	for(i = 0; i < s; i++)
	{
		//计算要分几次搬运,是下取整。
		int x = (int)ceil((double)n/1000);
		//如果回去搬萝卜的代价比搬过来的萝卜数量大,说明没价值,不要返回去搬,扔了。
		if(n % 1000 != 0 && n % 1000 <= x)
		{
			x -= 1;
		}
		//如果要回去多次搬运,则往返路程要计算好。两次搬运要走三次路。
		if(x == 2)
		{
			x += 1;
		}
		//如果要回去多次搬运,则往返路程要计算好。三次搬运要走五次路。一次搬运当然就一次路就OK了。
		else if(x == 3)
		{
			x += 2;
		}
		//让驴吃掉的萝卜。
		n -= x;
	}
	cout << "商人最多可卖出的胡萝卜数量为:" << n << endl;


	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值