閱讀272 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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
總結起來就是

(本表格參考其他博客)
備注:第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;
}

最後更新:2017-04-03 12:55:12

  上一篇:go How to install Django&#182;
  下一篇:go 2012年藍橋杯【初賽試題】奇怪的比賽