原题
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!
算法分析
1.x出生后每隔6分钟分裂一次
2.一个新出生的X,1分钟之后吃掉1个Y
3.X出生1分钟之后,每隔两分钟吃掉一个Y
4.Y每隔4分钟分裂一次
注:将时间计数均转化为整数,相应时间应乘2
源代码
#include<stdio.h>
#include <cmath>
#include<iostream>
#include <stdlib.h>
#include <map>
using namespace std;
int main()
{
map<int,long int> Xi;
Xi[0] = 10;
long int X = 10;
long int Y = 89;
for (int i = 1;i <= 120 && Y >= 0;i++)
{
for (map<int,long int>::iterator iy = Xi.begin();iy != Xi.end();iy++)
{
if ((i - iy->first) % 6 == 0 && i > iy->first)//X从出生每隔6分钟分裂一次
{
Xi[i] += iy->second;
X += iy->second;
}
if (i - iy->first == 1 && iy->first != 0)//新出生的X每隔一分钟吃掉一个Y
{
Y -= iy->second;
}
}
for (map<int,long int>::iterator iy = Xi.begin();iy != Xi.end();iy++)
{
if (iy->first == 0 && i % 2 == 0)//最初的X每隔两分钟吃掉一个Y
{
Y -= iy->second;
}
if ((i -1 - iy->first) % 2 == 0 && i >= iy->first + 3 && iy->first != 0)//X从出生一分钟后,每隔两分钟吃掉一个Y
{
Y -= iy->second;
}
}
if(i % 4 == 0)//Y每隔4分钟分裂一次
{
Y *=2;
}
if (Y < 0)
{
cout << i;
}
}
if (Y >= 0)
{
cout << Y;
}
else cout << 0;
system("pause");
return 0;
}
运行结果
当X = 10,Y= 89
Y = 0;
当X = 10,Y = 90
Y = 94371840.