微生物增值--蓝桥杯
欢迎访问我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1365917100.html
简述
这是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