問題描述
小藍有黃綠藍三種顏色的小球,分別為 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 是一樣的。刁奼接到乙個任務,為稅務部門調查一位商人的賬本...