AcWing 302 任務安排3

2021-10-03 11:39:07 字數 1612 閱讀 1655

題目描述:

有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。

機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。

從時刻0開始,任務被分批加工,執行第 i 個任務所需的時間是 ti。

另外,在每批任務開始前,機器需要 s 的啟動時間,故執行一批任務所需的時間是啟動時間 s 加上每個任務所需時間之和。

乙個任務執行後,將在機器中稍作等待,直至該批任務全部執行完畢。

也就是說,同一批任務將在同一時刻完成。

每個任務的費用是它的完成時刻乘以乙個費用係數 ci。

請為機器規劃乙個分組方案,使得總費用最小。

輸入格式

第一行包含兩個整數 n 和 s。

接下來n行每行有一對整數,分別為 ti 和 ci,表示第 i 個任務單獨完成所需的時間 ti 及其費用係數 ci。

輸出格式

輸出乙個整數,表示最小總費用。

資料範圍

1≤n≤3∗10^5

0≤s,ci≤512

−512≤ti≤512

輸入樣例:

5 1

1 33 2

4 32 3

1 4

輸出樣例:

153
分析:

在acwing 301 任務安排2中,我們給出了任務安排問題的斜率優化的解法,因為斜率k = st[i] + s是單調遞增的,所以佇列中小於當前k的斜率一定小於後面的k,於是我們在查詢第乙個大於k的斜率時將小於k的斜率都刪除了,從而保證了o(n)的時間複雜度。但是本題的ti可能是負數,儘管時間是負數設定得有些不合理,我們只能暫且認為它是合理的,ti是負數時,k = st[i] + s就未必單調遞增了,因為字首和不一定單調遞增了,這意味著,後面的k可能小於之前的k,我們不應該在尋找第乙個大於k的斜率時刪掉小於k的斜率了,因為後面的k還可能用到,但是不刪除小於k的斜率,意味著每次尋找j都需要從堵頭找起,時間複雜度最壞可能是平方級別的,為此我們在找第乙個大於k的斜率時,只能對佇列中的斜率做二分查詢,用o(nlogn)的時間複雜度去解決本題了。本題的其它**與上題一致,故分析過程可以參考上題,唯一修改的地方就是將原來出隊頭的**修改為二分找j的**了。

#include #include using namespace std;

const int n = 300005;

typedef long long ll;

ll f[n],t[n],c[n];

int q[n];

int main()

int hh = 0,tt = 0;

for(int i = 1;i <= n;i++)

f[i] = f[q[l]] - (t[i] + s) * c[q[l]] + c[i] * t[i] + s * c[n];

while(hh < tt && (f[q[tt]]-f[q[tt - 1]])*(c[i]-c[q[tt]]) >= (f[i]-f[q[tt]])*(c[q[tt]]-c[q[tt - 1]])) tt--;

q[++tt] = i;

}printf("%lld\n",f[n]);

return 0;

}

AcWing 302 任務安排3

題目傳送門 在 acwing 301 任務安排 2 中,我們給出了任務安排問題的斜率優化的解法,因為斜率 k st i s 是單調遞增的 直線與橫軸的夾角遞增 所以佇列中小於當前 k 的斜率一定小於後面的 k 於是我們在查詢第乙個大於 k 的斜率時將小於 k 的斜率都刪除了,從而保證了 o n 的時...

AcWing 300 任務安排

樣例 5個任務,每個任務的啟動時間是1 1 3 4 2 1 3 2 3 3 4 接下來算費用 第一批的費用總和是3 2 3 8 總的花費就是 8 9 72 第二批的費用總和是3 4 7 7 13 91 72 91 163 最優解是153,看來這麼劃分不是最優解,好,題目理解完畢。使用費用提前計算的思...

NKOI 1047 任務安排

任務安排 time limit 1000ms memory limit 65536k total submit 143 accepted 70 description n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批...