12屆藍橋杯12月模擬賽rgb題解

2021-10-20 19:50:00 字數 1306 閱讀 2159

問題描述

小藍有黃綠藍三種顏色的小球,分別為 r, g, b 個。同樣顏色的小球沒有區別。

小藍將這些小球從左到右排成一排,排完後,將最左邊的連續同色小球個數記為 t_1,

將接下來的連續小球個數記為 t_2,以此類推直到最右邊的小球。

請問,總共有多少種擺放小球的方案,使得 t_1, t_2, … 為嚴格單調遞增序列,即 t_1 < t_2 < t_3 < …

輸入格式

輸入一行包含三個整數 r, g, b。

輸出格式

輸出乙個整數,表示答案。

樣例輸入

3 6 0

樣例輸出

3樣例說明

用 r 表示紅球,g 表示綠球,可能的方案包括:

rrrgggggg 036

grrrggggg 135

ggrrrgggg 234

樣例輸入

2 4 6

樣例輸出

3樣例說明

用 r 表示紅球,g 表示綠球,b 表示藍球,可能的方案包括:

rrggggbbbbbb

grrgggbbbbbb

brrggggbbbbb

資料規模和約定

對於30%的評測用例,1 <= r, g, b <= 10;

對於60%的評測用例,1 <= r, g, b <= 30;

對於所有評測用例,1 <= r, g, b <= 50。

1.初步看題可知為列舉各種顏色小球的數量,來實現遞增序列,故確定思路為dfs.

2.我們應該如何列舉小球呢?可以利用遞增條件,記錄上一次列舉的數量,下一次列舉需要大於這個數量。dfs(sum,x,last)表示在sum個球中,前面選了顏色為last色的,x個球。接著再選j個顏色為i的,那麼剩下的球的選法和整體的選法相同,為dfs(sum-j,i,j)

3.遞迴邊界為三數字的累加。剪枝一為:last表示,這個選的小球和上次選的小球相同,則跳過。剪枝二為每次列舉遞增數量的小球。

#include

using

namespace std;

int a[3]

;int tot,res;

void

dfs(

int sum,

int x,

int last)

for(

int i=

0;i<

3;i++)}

}int

main()

dfs(tot,0,

-1);

cout

}

感謝張墨逸老師的指導!

安恆杯12月月賽

這次的月賽可以說非常適合我這種菜雞做了請求包中發現乙個user base64 解碼得到user,構造admin 然後base64提交 發現跳轉到後台admin.php 試了乙個ls發現有回顯,應該是個命令執行漏洞 構造 cmd ls ifs 成功回顯 然後讀取flag cmd cat ifs ffl...

藍橋杯12屆選拔賽3期 10題

給定乙個序列 a 1,a 2,a n 它的乙個上公升子串行是指從序列中取出一些元素,按照原來的順序排列後,是單調遞增的序列。例如,對於序列 3,2,7,6,7 取出下標為 2,4,5 的元素 a 2,a 4,a 5,即 2,6,7,是乙個上公升子串行。在這個序列中,有 7 個長度為 2 的上公升子串...

集訓模擬賽12

今天虎哥出題變簡單了,今天本來可以寫對三個題,但是 t2 由於沒看題目,改了乙個地方就過了,t3 還把陣列開小了,導致最後少拿了超級多的分。現在後悔也沒用了,吸取教訓吧,看題 該題與題庫中 how many answers are wrong 是一樣的。刁奼接到乙個任務,為稅務部門調查一位商人的賬本...