貝西要用幹草包堆出一座金字塔。幹草包會從傳送帶上陸續運來,依次出現 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 #include5using
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...