目錄update:文章已更新
板子題題目傳送門
題目描述
\(n\) 個任務排成乙個序列在一台機器上等待完成(順序不得改變),這 \(n\) 個任務被分成若干批,每批包含相鄰的若干任務。
從零時刻開始,這些任務被分批加工,第 \(i\) 個任務單獨完成所需的時間為 \(t_i\) 。在每批任務開始前,機器需要啟動時間 \(s\),而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。
每個任務的費用是它的完成時刻乘以乙個費用係數 \(f_i\) 。請確定乙個分組方案,使得總費用最小。
輸入格式
第一行乙個正整數 \(n\) 。
第二行是乙個整數 \(s\) 。
下面 \(n\) 行每行有一對數,分別為 \(t_i\) 和 \(f_i\) 表示第 \(i\) 個任務單獨完成所需的時間是 \(t_i\) 及其費用係數 \(f_i\) 。
輸出格式
乙個數,最小的總費用。
輸入輸出樣例
輸入 #1
5
11 3
3 24 3
2 31 4
輸出 #1
153
說明/提示
【資料範圍】
對於 \(100\%\) 的資料,\(1\le n \le 5000\) ,\(0 \le s \le 50\) , \(t_i,f_i\le 100\)
【樣例解釋】
如果分組方案是 \(\,\,\\) ,則完成時間分別為 \(\\) ,費用 \(c=15+10+30+42+56\) ,總費用就是 \(153\) 。
演算法理解
其實斜率優化是乙個數學建模。
前置知識:平面直角座標系上的直線。
演算法解析
因為講的是斜率優化,所以推dp式子的過程不再贅述了,不會的可以點這裡,包教包會。
為了方便敘述,我們令第 \(i\) 個產品的時間為 \(t_i\) , 係數為 \(c_i\) ,啟動時間 \(s\) 。為了方便進行兩個陣列區間和的運算,我們將 \(t,c\) 兩個陣列做一遍字首和,得到 \(sumt,sumc\) 兩個陣列。
令前 \(i\) 個的答案為 \(f_i\) ,初值為 \(f_0=0\) 。
不難得到dp式:
\[f_i=min_
if(flag) return -sum;
return sum;
}int n;
ll t[maxn],c[maxn];
ll sumt[maxn],sumc[maxn];
ll f[maxn],s;
int que[maxn],head,tail;
double js(int x,int y)
int main()
f[0]=0;
head=0; tail=0;
for(int i=1;i<=n;i++)
printf("%lld",f[n]);
return 0;
}
斜率優化學習筆記
目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...
斜率優化 學習筆記
前言 寒假yousiki講過斜率優化,但完全沒有聽懂。現在文化課解析幾何也學了不少,終於能做一些題了。有時候我們列出dp方程會得到形如這樣的式子 f i max min w i 1 leq j我們變換一下形式 2 a i b j f i a i 2 w i f j b j 2 仔細一看,上面的等式可...
斜率優化 學習筆記
事實上斜率優化是專門用來處理這樣一類 dp 式子的 dpi ai maxj 1i 1 bj cj basei 窩萌嘗試把上式中的 bj cj 和 basei 等價成 xj yj 和 ki 並把它們丟到乙個平面上,然後它萌就會變成一堆點 xj,yj 畫一條過他們的直線,類似於 y yj ki x xj...