微生物增殖—除去次方数—古堡算式—奇怪的比赛—欧拉与鸡蛋
①微生物增殖
假设有两种微生物 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 种群灭绝的最后一根稻草!
一道数学题哈,这道题,有个小技巧,因为有需要算0.5分钟的,很麻烦,所以不如都X2,总共为120,
每隔0.5分钟即为每隔1。
这样,这道题可以分析为:
X每隔6分裂一次,Y每隔4分裂一次。
新生X每隔1吃Y,此后每隔2吃Y。
求120后,Y的数目。
肯定不能拿手算啦。。好累的o(╯□╰)o,
可以仔细分析一下题目,可以用一个for循环模拟时间的增长,
那么就可以对4,6取模来判定X、Y的分裂时间。
最关键就是X什么时候吃Y,或许刚开始考虑的时候,你觉得要分新生X与以前的X,
可是,你仔细看就会发现不然,Y每隔4才分裂一次,而新生的X与老X吃Y时间是重合的。
所以,只要是奇数个时间段(以120为总和的时间段)就会吃Y。
可以画一个时间轴来更清晰的表示出来:
![](https://box.kancloud.cn/2016-06-22_576a44afb9071.jpg)
我们可以很清晰的看出,红蓝点会重合,也就是新生的X与以前的X吃Y的时间段是重合的,所以,就可以通过
判断是否为奇数断点来吃Y。
代码:
~~~
#include <iostream>
using namespace std;
int main()
{
int time;
int x=10,y=89; // 第二次把Y改成90就可以了
for(time=1;time<=120;++time)
{
if(time%2==1)
y-=x;
if(time%4==0)
y+=y;
if(time%6==0)
x+=x;
if(y<0) {y=0;break;}
}
cout<<y<<endl;
return 0;
}
~~~
②除去次方数
自然数的平方数是:1 4 9 16 25 …
自然数的立方数是:1 8 27 64 125 …
自然数的4次方数是:1 16 81256 …
…
这些数字都可以称为次方数。
1~10000中,去掉所有的次方数,还剩下多少个数字?
这题完全可以用筛法求素数的方式来计算哟,
就是注意一下,最大到多少次方,2的几次方大于10000呢?
众所周知,2^10=1024 -> 2^14>10000
代码:
~~~
#include <iostream>
#include <cmath>
#include <string.h>
using namespace std;
bool no[10001];
int main()
{
int i,j,k;
int num,sum;
memset(no,0,sizeof(no));
// j为次方数
for(j=2;j<=14;++j)
{
// i为底数
i=1;
k=pow(i++,j);
while(k<10001)
{
no[k]=1;
k=pow(i++,j);
}
}
// 查找
sum=0;
for(i=1;i<10001;++i)
if(no[i]==0)
++sum;
cout<<sum<<endl;
return 0;
}
~~~
③古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
一个五位数,乘以一个数得到另一个五位数,而且各位数字是相反的。
从题目中可以提取出的信息:
①相乘前后均为一个五位数
②这五位数各位数字没有相同的
③乘的是一个1~9的数字(准确的说是0~9,但是乘以0直接滤了)
我的做法:
设置一个变量Num从10000开始循环到100000,然后乘以1~9后的数传到函数,与原来num判断。
因为是结果填空题,所以就没有怎么优化,判断五个数各不相等,我也只是让第一个数不与后面的数相等。
这样就已经可以筛选的剩下一个了。。。
代码:
~~~
#include <iostream>
#include <string.h>
using namespace std;
int n[5];
void show(int num)
{
int i,temp;
temp=num;
for(i=0;i<5;++i)
{
if(num%10!=n[i]) return;
num/=10;
}
if(n[0]==n[1] || n[0]==n[2] || n[0]==n[3] || n[0]==n[4]) return;
cout<<temp<<endl;
}
int main()
{
int num,i,k,no;
for(num=10000;num<100000;++num)
{
for(k=1;k<10;++k)
{
memset(n,0,sizeof(n));
no=k*num;
if(no>100000) continue;
for(i=4;i>=0;--i)
{
n[i]=no%10;
no/=10;
}
show(num);
}
}
return 0;
}
~~~
④奇怪的比赛
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
多个答案顺序不重要。
这道题,可以暴力的。。。用10个变量,for循环。。。
我用的是模拟二进制加法,一直往最后一位加1,再判断各位,如果有等于2的就进位。
一直到下标为0的内容为1,则退出。。
对了,还要注意,题目中讲的是,如果答对该题目,当前拥有的分数翻倍,而不是得到当前题号X2的分数。
代码:
~~~
#include <iostream>
using namespace std;
int main()
{
int que[11]={0,0,0,0,0,0,0,0,0,0,0};
int i,j,sum;
// 最高位不为1则循环下去
while(que[0]!=1)
{
// 最低位+1
++que[10];
// 模拟二进制加法
for(j=10;j>0;--j)
if(que[j]==2)
{
++que[j-1];
que[j]=0;
}
// 初始sum为10,并算总分
sum=10;
for(j=1;j<11;++j)
if(que[j]==1) sum=sum+sum;
else sum=sum-j;
// 如果最后总分为100,则输出
if(sum==100)
{
for(j=1;j<11;++j)
cout<<que[j];
cout<<endl;
}
}
return 0;
}
~~~
⑤欧拉与鸡蛋
大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。
欧拉随便问:“卖了多少鸡蛋呢?”
不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!”
欧拉猜不出。
另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。
欧拉想了想,说出了正确答案。
我们不是数学家,懒得列出公式来分析。但计算机可以“暴力破解”,就是把所有可能情况都试验一遍,撞上为止!
请写出每人鸡蛋的数目(顺序不限),用逗号隔开。
一道解一元二次方程的题目,设一个人以a元价格卖了x个鸡蛋,另一个人以b元价格卖了y个鸡蛋。
据题目分析:
x+y=150
ax=by
bx=32
ay=24.5
就是解这个方程,用笔算的话。。我觉得听麻烦的,还是暴力快点。。。
还要注意一点就是,后面两个也可以是:
ax=32
by=24.5
所以,应该有2*n(n为答案个数)的答案。
因为没有确定谁卖了多少个。
代码:
~~~
#include <iostream>
using namespace std;
int main()
{
int x,y;
for(x=1;x<=150;++x)
{
y=150-x;
if(32*y*y==24.5*x*x)
cout<<x<<" "<<y<<endl;
if(32*x*x==24.5*y*y)
cout<<x<<" "<<y<<endl;
}
return 0;
}
~~~
蓝桥杯结果填空题,注意一下几点,手算快于机算,就用手算,但是如果用机算,手也不要闲着,多划拉几下。
不要注重代码的优化,因为它只要结果,代码再漂亮人家也看不见,这时间可以用在后面编程大题上。
多注意题目给的线索,一般每个线索都能用上。
- 前言
- 入门训练四道题
- 基础练习之闰年判断——BASIC-1
- 基础练习之01字串——BASIC-2
- 基础练习之字母图形——BASIC-3
- 基础练习之数列特征——BASIC-4
- 基础练习之查找整除——BASIC-5
- 基础练习之杨辉三角形——BASIC-6
- 基础练习之特殊的数字——BASIC-7
- 基础练习之回文数——BASIC-8
- 基础练习之特殊回文数——BASIC-9
- 基础练习之十进制转十六进制——BASIC-10
- 基础练习之十六进制转十进制——BASIC-11
- 基础练习之十六进制转八进制——BASIC-12
- 基础练习之数列排序——BASIC-13
- 算法训练之区间K大数查询——ALGO-1
- 算法训练之最大最小公倍数——ALGO-2
- 蓝桥杯-代码填空之一
- 蓝桥杯-代码填空之二
- 蓝桥杯-代码填空之三
- 蓝桥杯-代码填空之精品
- 蓝桥杯-历届试题之翻硬币
- 蓝桥杯-代码填空之四
- 蓝桥杯-结果填空题
- 蓝桥杯-结果填空之排座位
- 蓝桥杯-历届试题之大臣的旅费