第九屆藍橋杯國賽c++B組第二題
阿新 • • 發佈:2020-11-14
今天早起沒事幹,因為自己省賽的時候的垃圾狀態沒能打入決賽很不甘心,就隨便點開了一道國賽真題看了看,發現確實不難。
2.鐳射樣式
問題描述
x星球的盛大節日為增加氣氛,用30臺機光器一字排開,向太空中打出光柱。
安裝除錯的時候才發現,不知什麼原因,相鄰的兩臺鐳射器不能同時開啟!
國王很想知道,在目前這種bug存在的情況下,一共能打出多少種鐳射效果?
顯然,如果只有3臺機器,一共可以成5種樣式,即:
全都關上(sorry, 此時無聲勝有聲,這也算一種)
開一臺,共3種
開兩臺,只1種
30臺就不好算了,國王只好請你幫忙了。
要求提交一個整數,表示30臺鐳射器能形成的樣式種數。
注意,只提交一個整數,不要填寫任何多餘的內容。
答案:2178309
方法一:
思路:用dfs來做。
1.每一個燈都有兩條路可走,開啟或者不開啟。
2.當一個燈不開啟的時候直接往下走就可以了。
3.當一個燈開啟的時候,前提是:它前面的燈不開啟。(因為我們每次計算都是看的前面的燈,所以就保證了所有相鄰的燈不同時開啟,每個燈都會和它前面的燈比較。)
弄好思路之後就可以寫程式碼啦~
一道dfs模板題~
#include<bits/stdc++.h> using namespace std; const int N = 40; int st[N]; long long ans; void dfs(int x){ if(x > 30){ ans ++; return ; } dfs(x + 1); //x不開啟 if(!st[x - 1]){ st[x] = 1; //x開啟 dfs(x + 1); st[x] = 0; } } int main(){ dfs(1); printf("%d",ans); return 0; }
方法二:
通過觀察發現一個燈2,兩個燈3,三個燈5,符合斐波那契數列規律。
因此用斐波那契數列來做。
#include<bits/stdc++.h> using namespace std; const int N = 40; int st[N]; long long f[3]; int main(){ f[1] = 2; f[2] = 3; for(int i = 2 ; i < 30 ; i ++){ f[0] = f[1]; f[1] = f[2]; f[2] = f[0] + f[1]; } cout << f[2]; return 0; }