2012 蓝桥杯【初赛试题】微生物增殖

题目描述:

    假设有两种微生物 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的变化规律,问题就迎刃而解了……




转载于:https://www.cnblogs.com/zhezh/p/3773333.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值