牛吃草问题

1、概述

最近碰到一个面试题,讲的是牛吃草的问题,当时时间短,脑袋出现了短路,没有给出答案。回来特意查了一下答案,发现了一篇比较好的文章,现在重新抄写一份,用以加深印象。

1、牧场上有一篇匀速生长的草地,可供27头牛吃6周,或者供23头牛吃9周,那么它可供21头牛吃几周?要求不列方程式~

先思考:这个问题的难点在于,草的总量每天都在变,时间越长,草的总量就越多。草的总量是由2部分组成:某个时间期限前草场上原有的草量;这个时间期限后草场每天生长而新增的草量

结题:
假设 1 头牛每周吃的量为 1份,则
23 头牛 9 周吃的总草量为: 23 * 9 = 207 份
27 头牛 6 周吃的总草量为: 27 * 6 = 162 份
所以每周新生长的草量为:(207-162)% (9-6) =15份
每周新生长的草,可以够15头牛一直吃下去~
牧场上原有的草:23 * 9 - 15*9 = 72 份

牧场上的草21头牛几周能吃完呢?把这个问题分成2部分:一部分专吃牧场原有的草,另一部分专吃新生长的草。

让15头牛吃新生长的草,这样就可以一直吃下去,让剩下的6头牛吃原有的草,这样原有的草吃完了,就是能吃多少周的周数。
72%6 = 12,即12周。

看完是不是感觉自己会了?来继续,加强锻炼~

2、由于天气变冷,牧场上的草每天以均匀的速度减少。已知某草地上的草可供 20 头牛吃 5 天,或供15头牛吃 6 天。那么他可供多少头牛吃10天?

假设1 头牛一天吃 1份,则:
20 头牛5天的总草量: 20 * 5 = 100 份
15 头牛6天的总草量:15 * 6 = 90 份
每天的枯草量: (100-90)%(6-5)=10份
牧场上原有的草量:20 * 5 + 10 * 5 = 150 份
(150 - 10 * 10)%10 = 5 头

吃草吃够了,喝点水啊~

3、一只船发现漏水时,已经进了一些水,水是匀速进入船内。如果12人淘水,3小时淘完;如5人淘水,10小时淘完,如果要求2小时淘完,要安排多少人淘水?

假设1个人一小时淘水为 1 份,则
12 人三小时淘水总量为: 12 * 3 = 36
5 人10小时淘水总量为: 5 * 10 = 50
所以每小时进水量为: (50-36)%(10-3) = 2
淘水时已有水量为: 12 * 3 - 2 * 3 = 30
如果要求2小时淘完,要安排(30 + 2 * 2)%2 = 17 人淘水

好了关于这个题目就整理这么多了,下面的参考资料里面还有很多,原理都是一个,明白原理就可以了~

其实你列一下方程式就能明白整个逻辑,方便理解~

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
https://blog.csdn.net/Yaroo/article/details/52718422

吃草问题是一种经典的数学建模题,在计算机科学领域,尤其是算法设计和数据结构学习过程中也经常会被提到。下面我们就基于C++语言的特点来讲解如何解决这类问题。 ### 吃草问题简介 假设有一片草地,其上不断生长着青草;同时有若干头持续地在这块地上进食。已知每头每天消耗一定量的草,并且这片草地每天新增长固定数量的新鲜牧草。我们需要确定的是如果给定初始草存量、每日增草量以及每头日均食草量等条件后,需要多少天才能将所有现存及新生之草完全完等问题的答案。 此类题目通常会包含以下几个要素: - 初始时的总草量 \(M\) - 每单位时间内的自然增长草量 \(r\) (可以为负值表示减少) - 单位时间内一头的草的数量 \(e\) - 当前共有几只参与进食活动 #### 使用C++解决问题的基本步骤: 1. **输入处理**:首先读入相关的参数包括但不限于上述四种基本因素。 2. **计算核心公式推导** - 若仅考虑静态情况即忽略掉后续产生的新草,则所需时间为\(T = \lceil M / n * e\rceil\) 其中n代表当前存在的数; - 而动态情形下综合考量了原有存量加上期间生成部分后的总体积变化率应等于全体牲畜总的消费速率才会停止进化过程达到平衡点故而得到方程组形式求解未知变量如最终稳定状态下的群体规模或是耗尽全部资源所需的时刻长度等等信息内容。 ```cpp #include <iostream> using namespace std; int main(){ double m,r,e,n; cout << "请输入原始草量m:" ; cin >> m; cout << "请输入每天增加草量r(如果是减少则填入负数):" ; cin >> r ; cout << "请输入每头一天吃草量e:" ; cin >> e ; cout << "请输入现有的数量n:" ; cin >> n ; if(r >=0 && e*n <=r){ //永远不会完的情况 cout<<"由于草的增长速度大于等于群食用的速度,所以永远不可能把所有的草都完."<<endl; }else{ int days =(int)(m/(double)(n*e-r)); if(m%(n*e-r)!=0)days+=1;//向上取整操作 cout << "预计将在第"<<days <<"天结束之前或当天恰好把草场的所有草完."<< endl; } return 0;} ``` 通过以上程序段落展示了简单的实现思路其中需要注意边界条件例如当草原不存在额外再生能力也就是\(r<=0\)并且实际需求超出供给限制时候应当特别判断避免出现错误结果输出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值