AcWing 300 任務安排

2022-09-18 18:36:10 字數 1317 閱讀 9623

樣例:

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,看來這麼劃分不是最優解,好,題目理解完畢。

使用費用提前計算的思想, 考慮當前批的子任務, 所需要的啟動時間\(s\), 該啟動時間會累計到此後所有任務的完成時刻.

狀態定義

\(f[i]\)表示將前\(i\)個任務分成若干批執行的最小費用

轉移方程

\(f[i]=min(f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])\)

其中第\(j+1\)至\(i\)個任務在同一批次內完成

演算法設計

設定二重迴圈, 時間複雜度為\(o(n^2)\)

迴圈1: 設定子批次以第\(i\)個任務為結尾

迴圈2: 設定子批次以第\(j\)個任務為開始, 其中\(0

\(f[i]=min(f[i]\), 轉移方程計算結果)

ll s; //等待時間

ll sc[n]; //每個任務都有乙個花費,用c[i]來表示,sc[i]就是字首和

ll st[n]; //每個任務都有自己的執行時間t[i],字首和就是st[i]

ll f[n];

int main()

//初始化

memset(f, 0x3f, sizeof f);

f[0] = 0;

//n^2級的時間複雜度

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

for (int j = 0; j < i; j++)

f[i] = min(f[i], f[j] + st[i] * (sc[i] - sc[j]) + s * (sc[n] - sc[j]));

//輸出

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

return 0;

}

AcWing 302 任務安排3

題目描述 有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。從時刻0開始,任務被分批加工,執行第 i 個任務所需的時間是 ti。另外,在每批任務開始前,機器需要 s 的啟動時間,故執行一批任務所需的時間是啟動時間 s 加...

AcWing 302 任務安排3

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

NKOI 1047 任務安排

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