Vijos P1501 笨笨的果實採摘

2021-07-04 20:13:43 字數 2821 閱讀 1007

笨笨在小山頂上種了一棵果樹,秋天了,果樹結出了許多許多的果子,笨笨要去摘果子。

這是一棵可以結出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 ...