C语言 关于微生物增殖(假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次…引发的思考
程序之美
题目描述
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
输入
没有输入。
输出
两个整数,每个占1行。
有很多朋友拿到这个题目,无从下手,不知道怎么分析,怎么解决问题。这里我就冒充一次长者,带着大家捋顺一下思路。
在解题之前,我们先说下我们的方法,我们的方法叫三点一测法,何为三点一测呢。又是哪三点,哪一测呢。我们详细来讲。
三点一测法精髓:
第一点,提取题目核心点:
第二点,归一化题目分歧点:
第三点,全方位整理解题逻辑点,
一测:及时进行测试,调试,修复逻辑漏洞。
好了,我们就用这个题目开刀,给大伙讲解下具体的实践用法。
提取题目核心点
我们提取题目核心点,本题的核心点,也就是本题能够提供给我们的信息,包括显性的也包括隐形的。从这道题我们可以轻松的看到相关核心点。
比如:
1、生物X每三分钟分裂一次
2、生物Y每两分钟分裂一次
3、新出生X半分钟要吃掉一个Y,之后每一分钟吃掉一个Y。
本题基本上能够提取的信息也就这些。
序号 | 核心点 |
---|---|
1 | 生物X每三分钟分裂一次 |
2 | 生物Y每两分钟分裂一次 |
3 | 新出生X半分钟要吃掉一个Y,之后每一分钟吃掉一个Y |
看到这三个信息,我相信很多小伙伴蒙了,丈二的和尚,摸不着脑门,说没联系吧,有联系,唯一的联系就X吃Y,说有联系吧,一会二半分钟吃,一会一分钟吃的。
好了,我们核心点就提取到这里,下一步我们开始归一化分歧点。
归一化分歧点
对于以上核心点,小伙伴们很容易就能想到,我们可以定义两种生物X和Y。然后按分钟执行下去就可以了。如下:
其中相关性的操作主要有:
X分裂,Y分裂,X新出生半分钟吃掉一个Y,之后一分钟吃掉一个Y
在这里,对于X分裂,Y分裂,小伙伴们都没有悬念,认为直接写就可以了,比如:
三分钟后:X = X * 2;
两分钟后:Y = Y * 2;
主要分歧点就是X吃Y这一点,因为不是X固定时间去吃Y,而是刚出生半分钟吃掉一个Y,之后每一分钟吃掉一个Y。这时有些小伙伴就有些疑虑了,是不是需要去区分生物X是不是新生的,想到这里,可能整个都乱套了,是不是还要记下来每个生物X是不是新生的,吃过一次Y之后就不是新生的了,就可以一分钟吃一个Y了。但是统计每一生物的新生状态也是一笔不小的开销,既耗费脑细胞,也耗费存储资源。
这个时候,也就是我们感觉到问题的复杂性高,解题难度大时,我们可以想想是不是我们的思路错了,记得曾经有一位伟人说过,任何事情都是有一个最合适,最便捷,最合理的解决方案,如果当你觉得你走的路很累,甚至不通的时候,你可以考虑下是不是你的方向走错了,哈哈,这个伟人就是我。
这时我们在发散下思维,世界万物都一样都是有着宏观和微观的运动方式,当我们宏观难以解决时,我们是否考虑用微观的方式解决问题,当然,如果我们微观难以解决问题时,我们也可以考虑用宏观的方式解决问题。
以下是网上找的一个宏观微观的图片,宏观之中包含微观,微观又透漏着宏观的本质和属性。
从这点出发,我们将操作单位进行扩张,比如之前是一分钟一个操作单位,如果我们将操作单位改为半分钟呢?
这样,六个单位X分裂,4个单位X分裂,X从出生开始一个单位吃掉一个Y,之后每两个单位吃掉一个Y。
这时X吃掉Y的单位分别为:1单位,3单位,5单位,。。。。
看到了正好逢奇数X吃Y。
这时我们很容以的想到X吃Y可以通过判断当前时间单位i,通过i % 2 == 1方式来解决。
这时是不是思路豁然开朗,X生物一个单位吃掉一个Y,之后每逢奇数就吃掉一个Y。
至此,是不是小伙伴们已经有了整个逻辑的完整思路了,本来感觉复杂多变,摸不着脑门的问题,经过我们换一个思路,换一种方法,就能用很简单的方法解决掉。
其实所有问题,只要换一个思路,就会有意想不到的效果,解决问题也能变得简单,思路也能变得清晰。
计算机的思路,其实就是由宏观到微观,由微观到宏观的过程,只有具有了这样的大局观,我们遇到问题才能所向披靡,迎刃而解。
其实想想,很多小伙伴们不难理解,计算机就是一个宏观与微观的产物。宏观到其是庞然大物,存储数据量巨大惊人,运算速度更是令人惊叹,百亿次,千亿次的秒级运算量已成为家常之物。微观到,它可以将几千年的历史数据有序的展现,也可以将一张一张的影视图片流式化成电影,可以将细胞分裂,细菌活动等状态一一模拟,展现在人们面前,形成仿真。
遇到问题时只要我们运用计算机的这个有宏观到微观,由微观到宏观的思路,我相信很多问题都可以找到最优解决方案,既省时又省力。
整理解题逻辑点
解题思路:
经过上述流程图,我想信很多小伙伴们已经整理出来了解题逻辑点,对了:
1、输入X生物和Y生物的个数。
2、120个单位,每个单位中,执行如下操作:
逢奇数X吃Y
每四个单位Y分裂
每六个单位X分裂
3,输出最后Y所剩的个数。
具体实现代码如下:
#include<stdio.h>
int main()
{
int x=10,y=90;
for(int i=1;i<=120;i++) //将时间的单位往后延顺到120个单位
{
if(i%2==1)//按照题目的条件,正好逢奇数x吃y
y=y-x;
if(i%4==0)//变成4分钟
y=y*2;
if(i%6==0)//变成6分钟
x=x*2;
}
printf("%d",y);
return 0;
}
答案:
0
94371840
好了,今天就说到这里吧,有兴趣的小伙伴可以继续探讨,钻研,看有没有更完美的解法,也欢迎小伙伴们和我联系交流,批评指正。