`
xitong
  • 浏览: 6188449 次
文章分类
社区版块
存档分类
最新评论

微生物增值--蓝桥杯

 
阅读更多

简述

这是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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics