USACO 乾草金字塔

2022-05-11 12:23:07 字數 1222 閱讀 5886

貝西要用幹草包堆出一座金字塔。幹草包會從傳送帶上陸續運來,依次出現 n 包,每包乾草可

以看做是乙個二維平面上的乙個長方形,第 i 包乾草的寬度是 w i ,長度統一為 1。

金字塔的修建有幾個規定,首先,為了建築穩定,塔一定要形成類似「金」字的樣子,即塔的上

層寬度不能超過下層寬度,而且每層的幹草包必須緊靠在一起,不能出現縫隙。其次,由於乾草是陸

續送來的,所以先送來的乾草放在較低層。貝西會選擇最先送來的幾包乾草,堆在地上作為第一層,

然後再把緊接著送來的幾包幹草包放在第二層,再鋪建第三層……重複這個過程,一直到所有的乾草

全部用完。最後,貝西不喜歡浪費,所有幹草包一定要用上,不能棄置不用。貝西的目標是建一座最

高的金字塔,在遵循上述規定的前提下,她可以任意決定在金字塔的每一層布置多少連續的幹草包。

請你來幫助她完成這個任務吧。

• 第一行:單個整數 n,1 ≤ n ≤ 100000

• 第二行到第 n + 1 行:第 i + 1 行有乙個整數 w i ,1 ≤ w i ≤ 10000

• 單個整數:表示可以建成的最高高度

3 1 2 3

2將 1 和 2 放在第一層,將 3 放在第二層

題解:

我們從上往下搭 方便轉移

設f[i]為後i個最多搭多少層,p[i]為最下面一層為多少

很容易得出 如果滿足sum[i]-sum[j]>=p[j] 就可以轉移f[i]=f[j]+1

移項sum[i]>=sum[j]+p[j] 所以我們要選出滿足條件的最大sum[j]+p[j] 這樣轉移來的答案一定是最優的

於是開單調佇列維護sum[j]+p[j]

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int n=100015;7

intgi()

13int

a[n],sum[n],f[n],p[n],q[n];

14int

main()

1529 printf("%d"

,ans);

30return0;

31 }

乾草金字塔

時間限制 1 sec 記憶體限制 128 mb 貝西要用幹草包堆出一座金字塔。幹草包會從傳送帶上陸續運來,依次出現 n 包,每包乾草可 以看做是乙個二維平面上的乙個長方形,第 i 包乾草的寬度是 w i 長度統一為 1。金字塔的修建有幾個規定,首先,為了建築穩定,塔一定要形成類似 金 字的樣子,即塔...

USACO 1 5 1 數字金字塔

觀察下面的數字金字塔。寫乙個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。7 3 8 8 1 0 2 7 4 4 4 5 2 6 5在上面的樣例中,從7 到 3 到 8 到 7 到 5 的路徑產生了最大 input format fi...

python 金字塔 Python金字塔

托倫,函式中有幾個小錯誤和乙個邏輯問題print y to a 請注意,此函式生成乙個以z開頭的字串,但您希望將字串以相反的方向連線,而您的另乙個函式print a to y 確實停止了 1位置 例如 還要注意,您需要新增新行字元 n 以獲得一些不錯的輸出。在 我的解決方案是 def print a...