C语言/牛吃草问题-创新互联

今天在刷题过程中遇到了一个虽然很基础但仔细想想还挺有意思的一道题目:

成都创新互联公司专注于成都网站建设、网站设计、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。题目描述

有一个牧场,牧场上的牧草每天都在匀速生长,这片牧场可供m头牛吃a天,或可供n头牛吃b天,那么这片牧场每天新生的草量可供几头牛吃1天?

输入

两行数据

每行数据包括牛的数量以及吃草的天数

输出

每天的新生的草量可供几头牛食用一天

样例输入
15 20
20 10
样例输出
s=10
解题过程

很容易我们会写出下面的一段代码:

#includeint main()
{
int m,n,a,b,s;
scanf("%d %d\n",&m,&a);
scanf("%d %d",&n,&b);//每天新生的草量x多少?每头牛每天的胃口y是多少?

但这道题的精髓在于如何表示s。

于是我们先来分析一下题目中的变量关系:

我们很容易会发现有两个重要的量插在逻辑线里成为我们对这道题的难点所在,一个是每天新生的草量多少?每头牛每天的胃口是多少?(注意这里是指每头牛每天的摄入量,我一开始是没有注意到每天的这个限定条件的,走了不少弯路,后面我会详细解释为什么我要强调这一点)

所以我首先是列了这样的两行关系:

m*y=a*x
n*y=b*x

显然,这问题大的不是一点。

随后我意识到题目中的一些隐含条件,于是改成了这样:

m*y=a*x+A
n*y=b*x+A

这里的A是牛被放进牧场还没吃草时的原始草量,嗯~ o(* ̄▽ ̄*)o,符合常理。

OK,然后我们回到题目中明确我们的目标量,要求的是一天新生的的草量可养几只牛,也就是我们要求得每天的新生的草量和每只牛每天的食草量。

即,求x/y,通过上述两个式子求解,可得

s=(m-n)/(a-b)

开玩笑,这不用说答案的值都知道必错无疑,正负号妥妥有问题。

虽然知道了确实有问题,就是不知道咋改,然后多读几遍题和计算式,换个思路重新思考这个问题,我们会发现,这个题内有玄机。

这个题有一个很重要的信息,牛养的越多,能撑的天数就越少(常识)。而上面我的式子按照简单的守恒关系划了等号,这就无法涉及到关于每天是否新长草的问题了,而是有多少吃的牛就吃多少的直线条逻辑。但重点在于牛不是在特定的那个时间点之前吃完的,说明在此之前,草量足够,供大于需,在那一刻,牛把他能吃完的草都吃完了,新长的草供应小于需求。

所以,应该把单位明确为每一天,在每一天牛吃的量等价于当天新长的草在加上初始草量在每一天的分摊量,即:

每天牛吃的量= 每天新生草量+ 原始草量 均摊 给每天的被摧残量

现在,我们按照上述以天为单位的等式列出:

m*y=x+A/a
n*y=x+A/b

可得

s=(a*m-b*n)/(a-b)

完善我们的代码

#includeint main()
{
int m,n,a,b,s;
scanf("%d %d\n",&m,&a);
scanf("%d %d",&n,&b);//每天新生的草量x多少?每头牛每天的胃口y是多少?
s=(m*a-n*b)/(a-b);
printf("s=%d",s);
return 0;
}

编译运行

成功!

题后补充

完成之后,我对这个题型觉着挺有意思,于是上网查了一下:

在一篇知乎文章中,有人提到了净消耗率:(感兴趣可以知乎查“牛吃草问题的速解法”一文,下面是截取于该文章的一部分)

对牛进行划分,也不妨是一种思路。

如上图,我们把进行净消耗率的牛设为B和D,可得

y=A/a*B=A/b*D
X=(m-B)*y=(n-D)y

进行运算后,可得

s=(a*m-b*n)/(a-b)

与上面的我的第一种方法所求答案一致。

于是我们用两种思路,求解了s的表达式。

牛吃草问题也叫牛顿问题,在生活中有常见的应用,例如工厂供给消耗的应用环境等等。关键在于每天都在消耗的同时不断匀速供给(也叫消长),消耗端与维持时间呈反比关系,容易忽视时间单位(易错)。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:C语言/牛吃草问题-创新互联
URL网址:http://myzitong.com/article/ihsgd.html