樣例:
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開始,這些任務被分批...