笨笨在小山頂上種了一棵果樹,秋天了,果樹結出了許多許多的果子,笨笨要去摘果子。
這是一棵可以結出3種不同果實的樹,它的果實長在樹枝的分叉處和樹頂上。
果實分3種:普通果實、奇異果實和稀有果實。
這顆樹的第乙個分叉可以用乙個2進製碼表示(也就是許多的「1」和「0」),
而第乙個分叉又分成2個分叉,分別用第乙個分叉的前半段和後半段表示(從中間分開),
其他分叉也如此。分叉分到最後只剩下「1」或「0」時就成了樹頂。
每個分叉只能分成2個分叉。
表示這棵樹第乙個分叉的2進製碼必定是2的乘方位。
例如:
1 0 1 0
\ / \ /
10 10
\ /
1010
這就是一棵笨笨種的樹。
三種果實的分辨方式為:
普通果實:既有「1」又有「0」;
奇異果實:只有「1」;
稀有果實:只有「0」。
每種果實的價值不同,普通果實1元,奇異果實2元,稀有果實5元。
笨笨能摘到的果實範圍是一定的,他想知道他所能摘到果實的總價值。
像剛剛所示的「1010」樹,它有3個普通果實,2個奇異果實和2個稀有果實,
若笨笨能摘到最高2,最低0,那麼他就能得到所有的果實,果實的總價值為3*1+2*2+5*2=17元。
輸入格式
第一行乙個數n,表示這個2進製碼的位數是2的多少次乘方(即長度為2^n,0<=n<=15)。
第二行2個數u,d,表示笨笨可以摘到的最大高度和最小高度(0<=d<=u<=100000)。
第三行為表示第乙個分叉的位數為2^n位的2進製數。
輸出格式
乙個數,笨笨所能摘到果子的最大總價值。
樣例1
樣例輸入1[複製]
3 3 0
10001011
樣例輸出1[複製]
時限1s。
第乙個分叉的高度為0,後面的依次遞增,每層加1。
樣例解釋:可以有4層共15個分叉(包括樹頂),
5個普通果實,5個奇異果實,5個稀有果實。
5*1+5*2+5*5=40
笨笨原創。
第0層指的是葉子,第n層指的是根
該題只是乙個簡單的遞迴即可完成。
program p1501;
var n,u,d:longint;
str1:ansistring;
cost:qword;
procedure
division
(n,step:longint;str1:ansistring);
begin
if (step>=d)and(n>=0)
then
begin
ifstep
<=u
then
begin
if pos('0',str1)=0
then
begin
cost:=cost+2;
endelse
begin
if pos('1',str1)=0
then
begin
cost:=cost+5;
endelse
begin
cost:=cost+1;
end;
end;
end;
if n>0
then
begin
division(n-1,step-1,copy(str1,1,(1
<<(n-1))));
division(n-1,step-1,copy(str1,(1
<<(n-1))+1,(1
<<(n-1))));
end;
end;
end;
begin
readln(n);
readln(u,d);
readln(str1);
division(n,n,str1);
write(cost);
end.
測試資料 #0: accepted, time = 1 ms, mem = 1200 kib, score = 10呃呃,最近沒啥好說的了。。。測試資料 #1: accepted, time = 2 ms, mem = 1200 kib, score = 10
測試資料 #2: accepted, time = 0 ms, mem = 796 kib, score = 10
測試資料 #3: accepted, time = 1 ms, mem = 800 kib, score = 10
測試資料 #4: accepted, time = 2 ms, mem = 796 kib, score = 10
測試資料 #5: accepted, time = 1 ms, mem = 1164 kib, score = 10
測試資料 #6: accepted, time = 1 ms, mem = 796 kib, score = 10
測試資料 #7: accepted, time = 4 ms, mem = 1092 kib, score = 10
測試資料 #8: accepted, time = 15 ms, mem = 1056 kib, score = 10
測試資料 #9: accepted, time = 15 ms, mem = 1060 kib, score = 10
accepted, time = 42 ms, mem = 1200 kib, score = 100
Codeforces 1501C (數學 暴力)
給定 n 個數 n 200000 求是否存在一對 x,y 和 z,w 使得 a a a a 由於題目中每個數字的範圍位於 1,2.5 10 6 所以任意兩個數的和都在 2,5 10 6 區間內。由鴿巢原理得,列舉 5 10 6 對 i,j 後,一定存在一對 x,y 和 z,w 具有相同的 sum 所...
HDU1501 Zipper(DFS 記憶化搜尋)
題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...
Hdu 1501(記憶化搜尋,dp)
hdu 1501 思路 1 記憶化搜尋 找字串是否匹配,只需要找到字串的對應順序一致即可。資料不大,所以可以開乙個二維陣列記錄s1,s2連個字串中字元出現的位置,然後與結果串進行匹配。include include includeusing namespace std const int maxn ...