書架 紀中2931 dp 堆

2021-07-14 16:36:02 字數 1299 閱讀 2481

題目大意

當farmer john閒下來的時候,他喜歡坐下來讀一本好書。 多年來,他已經收集了n本書 (1 <= n <= 100,000)。 他想要建立乙個多層書架,來存放它們。 每本書 i 擁有乙個寬度 w(i)和乙個高度 h(i)。 所有的書需要按順序,放到書架的每一層。 舉例來說,第一層書架放k本書,應該放書1...k;第二層書架從第k+1本書開始放……。 每層書架的寬度最多為l (1 <= l <= 1,000,000,000)。 每層書架的高度為該層最高的那本書的高度。 書架的總高度為每層書架高度之和。 請幫fj計算書架可能的最小總高度。

分析 一眼就看出是dp

(因為每天的第四或第三題都是dp)

最簡單的方程是

f[i]=min

其中w[j]+w[j+1]...w[i]<=l。

但是這個東西是o(n²),會超時。所以聯絡到求最大值,可以想到用最大值的單調佇列,佇列裡面存放的是以 i 為結尾,視窗裡面的元素和恰好不大於 m 的 j 為左邊界,即恰好有 sum[i] - sum[j-1] <= m.同時h也用單調佇列優化。

然後這樣乙個可行解就是,f[ i ]=f[j]+h[a[r]](即隊首元素的值), 這並不是最優解,所以還要找到佇列中的最優解,乙個可能的最優解只能是這樣的f[i]=f[a[r-1]]+h[a[r]],也就是 a[ r ] 要大於後面的數,很顯然,如果a[ r]小於後面的數,那麼我們就可以將 a[ r ] 劃分到後面去,而取得更優解。這裡涉及的這個找最優解問題,可以用set。

看不懂的自行腦補(雖然我也不是很知道我在打什麼,具體的見**)

又是他——                

蜜汁c++ **

#include #include #include #include using namespace std;

typedef long long ll;

ll que[100100],a[100100],dp[100100],b[100100];

ll n,m,sum;

ll i,j,k;

ll front,rear,p=1;

multiset lxf; //erase insert begin

int main()

front=1; rear=1;

dp[1]=a[1];que[rear]=1;

sum=b[1];

for(i=2;i<=n;i++)

rear=rear+1;

que[rear]=i;

if (front

區間 紀中1382 dp

alice收到一些很特別的生日禮物 區間。即使很無聊,alice還是能想出關於區間的很多遊戲,其中乙個是,alice從中選出最長的不同區間的序列,其中滿足每個區間必須在禮物中,另序列中每個區間必須包含下乙個區間。程式設計計算最長序列的長度。輸入檔案第一行包含乙個整數n 1 n 100000 表示區間...

跳舞 紀中2545 dp

小明今天得到乙個跳舞毯遊戲程式dance。遊戲每次連續出n 個移動的 箭頭 箭頭依次標號為1 到n,並且的相應的分數s 1.n 如果你能 踏中 第i 號箭頭,你將獲得相應的分數s i 否則將被扣除相應的分數。另外,遊戲還有乙個累計獎勵機制 如果踏準次數累計達到t,並且是在踏中第i個箭頭達到的,則將得...

邦德 紀中 1236 狀壓dp

題目大意 每個人都知道詹姆斯邦德,著名的007,但很少有人知道很多任務都不是他親自完成的,而是由他的堂弟們吉公尺邦德完成 他有很多堂弟 詹姆斯已經厭倦了把乙個個任務分配給乙個個吉公尺,他向你求助。每個月,詹姆斯都會收到一些任務,根據他以前執行任務的經驗,他計算出了每個吉公尺完成每個任務的成功率,要求...