[蓝桥杯历届试题]空瓶换汽水; 微生物增殖; 除去次方数

1.空瓶换汽水

浪费可耻,节约光荣。饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料。刚好小明前两天买了2瓶该饮料喝完了,瓶子还在。他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一瓶该饮料,喝完还瓶!!

饮料店老板一统计,已经售出该饮料且未还瓶的有12345瓶,那么如果这些饮料的买主都如小明一样聪明,老板最多还需要送出多少瓶饮料呢?

显然答案是个正整数。

参考答案:

6172

解答:

 最多送饮料的情况就是一个人拥有12345个空瓶,然后每次都拿着两个空瓶就去换酒,因为如果拿着三个瓶去换酒的话,你就会少三个空瓶,而前者你会少两个空瓶。所以前者是最最优的。 12345/2

 

2.微生物增殖

假设有两种微生物 X Y

X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

一个新出生的X,半分钟之后吃掉1Y,并且,从此开始,每隔1分钟吃1Y

现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。

如果X=10Y=90  呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!

 

请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!

两个整数,每个1行。

参考答案:

0       

94371840

解答:

以半分钟为单位,画图分析一下就可以知道无论是新出生的X还是老的X,它们都是在单位为奇数个的时候吃Y的,这个就是重点啊,自己愣是半天没想出来啊。

代码:

#include <iostream>
#include <string.h>
using namespace std;

int main(int argc, char *argv[]) {
	int x=10,y=89;
	for(int i=1;i<=120;i++)
	{
		if(i%6==0)
		x*=2;
		if(i%4==0)
		y*=2;
		if(i%2==1)
		y-=x;
		if(y<=0)
		{
			y=0;
			break;
		}
	}
	cout<<x<<" "<<y<<endl;
	return 0;
}


3.除去次方数。

自然数的平方数是:1 4 9 16 25 …

自然数的立方数是:1 8 27 64 125 …

自然数的4次方数是:1 16 81 256 …

这些数字都可以称为次方数。

1~10000中,去掉所有的次方数,还剩下多少个数字?

 

参考答案:

9875

解答:

暴力搜。注意退出条件。用一个10000的数组来保存状态。

代码:

#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;

long long cifang(int i,int j)//计算i的j次方
{
	long long sum=i;
	for(int k=2;k<=j;k++)
	sum*=i;
	return sum;	
}
int a[10001];
int main(int argc, char *argv[]) {
	a[1]=1;
	int i=2,j=1;
	memset(a,0,sizeof(a));
	for(i;cifang(i,j)<=10000;i++)
	{
		for(j;cifang(i,j)<=10000;j++)
		{
			a[cifang(i,j)]=1;
		}
		j=2;//注意这一句。对于每个i都从2次方开始。千万别忘了这一句。
	}
	int count=0;
	for(int i=1;i<=10000;i++)
	if(a[i]==0)
	count++;
	cout<<count<<endl;
	return 0;
}


 

posted @ 2014-03-14 21:12  同学少年  阅读(349)  评论(0编辑  收藏  举报