有\(n\)個任務,每個任務有一定的完成時間\(t_i\)和費用係數\(c_i\),每一批任務完成的時間為啟動時間\(s\)加上完成的總時間,費用這個任務為所在批次的完成時間乘上它的費用係數,求最小代價。
比較容易得到乙個\(n^3\)的\(dp\),我們考慮暴力列舉任務和批次,令\(f[i][j]\)表示前\(i\)個任務分成\(j\)批的最小代價,在預處理完字首和之後,那麼\(f[i][j]=min\\),直接求即可。
考慮前乙個做法中批次並沒有關鍵的用途,我們需要的僅僅是機器的啟動次數,用滾動陣列優化空間後,考慮到每次啟動都會對後續有影響,我們可以直接計算這個費用。令\(f[i]\)表示前\(i\)個任務的最小花費(包括後續影響),那麼\(f[i]=min\\),複雜度為\(n^2\)
我們再進行優化,去掉小括號,並化簡,可得:
\[f[j]=(sumt[i]+s)sumc[j]+f[i]-sumt[i]*sumc[i]-s*sumc[n]
\]這樣我們就可以看做乙個與\(j\)相關的一次函式,每個點為\((sumc[j],f[j])\),對於當前的\(i\),由於除\(f[i]\)都是確定的,我們只要讓直線的截距最小即可,這個可以通過維護下凸殼來實現,複雜度為\(o(n)\)
#includeusing namespace std;
const int n=1e4+10;
int read()
while(ch>='0'&&ch<='9')
return res*w;
}int sumt[n],sumc[n],f[n],q[n];
int main()
printf("%d\n",f[n]);
}
任務安排 jobs
題目 任務安排 jobs.c cpp pas in out 時限 每個測試點2 秒 問題描述 小y 最近遇到了乙個棘手的問題。她有兩項任務需要完成,其中第一項任務是重複操作1 op1 s1 次,第二項任務是重複操作2 op2 s2 次。為了完成這些任務,小 y 僱傭了n 名工人。其中,第i 個工人完...
近期任務安排
最近有點忙。大三已經結束,可以說是畢業了,面臨繼續讀書和工作的抉擇。經過一段時期的思考,最終決定繼續讀書,感覺計算機的某些領域比較有意思,比如說資料探勘等,真想在這方面深入研究下去。而且以自己的性格來說,比較適合做科研,以目前的狀態來說,還沒有做好進入職場打拼的準備,呵呵。暑期打算參加中科院軟體所的...
任務安排1
有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。從時刻0開始,任務被分批加工,執行第 i 個任務所需的時間是 titi。另外,在每批任務開始前,機器需要 s 的啟動時間,故執行一批任務所需的時間是啟動時間 s 加上每個...