题目描述:
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目分析:
这个题目的难点在于找到x和y之间的规律,找到规律之后再书写代码就是很简单了。
我们以x=10,y=90的情况进行分析:
一开始的10个x是刚出生的,所以它们在半分钟之后就要吃y,所以0.5分钟的时候,y的数量减少,注意:下一次吃y的时候是1分钟之后;
在1分钟的时候,x不分裂,y也不分裂,并且x并不会吃y;
在1.5分钟的时候,每个x吃掉一个y;
在2分钟的时候,x加倍,此时x并不吃掉y;
在2.5分钟的时候,每个x吃掉一个y;
在3分钟的时候,x加倍,此时x并不吃掉y;
在3.5分钟的时候,每个x吃掉一个y(此时的20个x中,10个是新生的x,因为距离出生过了0.5分钟,所以吃掉一个y;还有10个是老的x,因为距离上次吃y已经过了1分钟,所以再吃掉一个y);
在4分钟的时候,y加倍,x并不吃y;
在4.5分钟的时候,每个x吃掉一个y(因为此时的20个x都是老的x了);
在5分钟的时候,x不变,y也不变;
在5.5分钟的时候,每个x吃掉一个y;
在6分钟的时候,x加倍,y加倍,此时x并不会吃掉y;
……
通过以上,我们可以得出x和y的数量变化的规律:
x并不会死亡,数量随着时间呈指数增长;
y自身会随着时间的增加而增加,但是其数量还受到x的限制;
我们还可发现,x在时间为2的倍数的时候加倍,y在时间是3的倍数的时候加倍,而x吃掉y是在每个半分钟的时候发生的,所以当x吃y的时候,x不会加倍,y也不会加倍。
因此,可以把以上三个时间看成是相互独立的。
时间 |
x的数量 |
y的数量 |
备注 |
0.0 |
10 |
90 |
|
0.5 |
10 |
80 |
80=90-10 |
1.0 |
10 |
80 |
|
1.5 |
10 |
70 |
70=80-10 |
2.0 |
10 |
140 |
140=70*2 |
2.5 |
10 |
140 |
130=140-10 |
3.0 |
20 |
130 |
|
3.5 |
20 |
110 |
110=130-20 |
4.0 |
20 |
220 |
220=110*2 |
4.5 |
20 |
200 |
200=220-20 |
5.0 |
20 |
200 |
|
5.5 |
20 |
180 |
180=200-20 |
6.0 |
40 |
360 |
|
6.5 |
40 |
320 |
320=360-40 |
7.0 |
40 |
320 |
|
7.5 |
40 |
280 |
280=320-40 |
8.0 |
40 |
560 |
560=280*2 |
8.5 |
40 |
520 |
520=560-40 |
9.0 |
80 |
520 |
|
由上面的规律得到程序代码:
#include <iostream> using namespace std; int main() { int i; int x=10,y=90; for(i=1;i<=120;i++) { if(i%2==1)y=y-x; //每当到了半分钟的时候,x会吃掉y if(i%4==0)y=y*2; //每隔2分钟,y分裂一次 if(i%6==0)x=x*2; //每隔3分钟,x分裂一次 } cout<<y<<endl; return 0; }
94371840
评论:该题目作为2012年蓝桥杯的第一道题目,本身并不是很难,只不过需要考生细心的对微生物的增值过程进行分析,分别找到x和y的变化规律,问题就迎刃而解了……