微生物增殖—除去次方數—古堡算式—奇怪的比賽—歐拉與雞蛋
①微生物增殖
假設有兩種微生物 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。
可以畫一個時間軸來更清晰的表示出來:

我們可以很清晰的看出,紅藍點會重合,也就是新生的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
- 藍橋杯-代碼填空之一
- 藍橋杯-代碼填空之二
- 藍橋杯-代碼填空之三
- 藍橋杯-代碼填空之精品
- 藍橋杯-歷屆試題之翻硬幣
- 藍橋杯-代碼填空之四
- 藍橋杯-結果填空題
- 藍橋杯-結果填空之排座位
- 藍橋杯-歷屆試題之大臣的旅費