简述
这是2012年第三届蓝桥杯全国软件大赛预赛(C++本科组)第一题。
推荐链接:《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的数目。
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!
请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!
分析
简单的一道题,循环加判断而已,没什么算法,为什么总是在做的时候总是犹豫不决呢,在做出奇葩的结果的时候不相信自己呢?
源代码
我的最初的代码
# include <stdio.h>
int main(void)
{
int x, y;
float time;
x = 10;
y = 89;
for(time = 0.5; time <= 60; time = time + 0.5){
if((int)(2 * time) % 6 == 0){
x = x * 2;
}
if((int)(2 * time) % 4 == 0){
y = y * 2;
}
if((int)(2 * time) % 2 == 1){
y = y -x;
}
}
printf("%d, %d\n", x, y);
return 0;
}
考虑到半分钟的时候只有X吃Y一个活动,可以把它放到每一分钟的开始部分
# include <stdio.h>
int main(void)
{
int x, y;
int time;
x = 10;
y = 90;
for(time = 1; time <= 60; time++){
y -= x;
if(time % 3 == 0){
x = x * 2;
}
if(time % 2 == 0){
y = y * 2;
}
}
printf("%d, %d\n", x, y);
return 0;
}
某人共享的一份C++风格的代码,虽然代码风格行内使用Tab缩进、运算符两侧没有空格不好,但是分裂的时候*2用位运算代替,提高效率的同时更加简洁。
#include<iostream>
using namespace std;
int main(void)
{
int x,y;
cin>>x>>y;
for(int i=1 ; i<=60 ;i++)
{
y-=x;
if(i%2==0){y<<=1;};//每两分钟Y分裂一次
if(i%3==0){x<<=1;};//每三分钟X分裂一次
if(y<=0)
{
y=0; //Y数量不够X吃的了,最少就是0
break ;
}
}
cout<<y;
//system("pause");
return 0;
}
最后答案
当Y = 89时,Y的数量60分钟后为 -979369984(也就是0)
当Y = 90时,Y的数量60分钟后为 94371840