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关于时间的对应关系即可。

先看一下前9分钟的情况(以10和90为例)

时间 x y 原因
0.0        10           90         
0.5 10 90  
1.0 10 80 90-10
1.5 10 80  
2.0 10 140 (80-10)*2
2.5 10 140  
3.0 20 130 140-10
3.5 20 120 130-10
4.0 20 220 (120-10)*2
4.5 20 210 220-10
5.0 20 200 210-10
5.5 20 190 190-10
6.0 40 360 (190-10)*2
6.5 40 340 360-20
7.0 40 320 340-20
7.5 40 300 320-20
8.0 40 560 (300-20)*2
8.5 40 540 560-20
9.0 80 520 540-20
总结起来就是

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

(本表格参考其他博客)
备注:第0.5秒时,由于原来给的10个x不是新生,所以这0.5秒x不会吃y

可以看出,每隔3秒,x加倍一次

当秒数是奇数时,对于y,y=y-x;

当秒数是偶数时,对于y,y=(y-x)*2;

要注意的是,必须分清x,y增值以及x吃y的先后顺序:

首先要进行x吃y的判定,之后才能进行增值,如果先进行增值的话,就会发生错误!

当x=10,y=90时,最后y的结果是:94371840

计算代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,m;
    double x,y;
    scanf("%d%lf%lf",&n,&x,&y);
    m=1;
    while(m<=n)
    {
       if(m%2!=0)
       y=y-x;
       if(m%2==0)
       y=(y-x)*2;
       if(m%3==0)
       x*=2;
       //printf("m=%d x=%.0lf y=%.0lf\n",m,x,y);
       m++;
    }
    printf("x=%.0lf y=%.0lf\n",x,y);
    system("pause");
    return 0;
}

上一篇:竟有如此缤纷的 AIR 学习指导:推荐《Adobe AIR 完整入门与开发实录》


下一篇:Facebook 将神奇动画引擎 Pop 开源了!