1606 例 1 任務安排 1

2022-06-20 05:54:09 字數 1388 閱讀 2171

1606:【 例 1】任務安排 1

時間限制: 1000 ms 記憶體限制: 524288 kb

提交數: 203 通過數: 149

【題目描述】

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

乙個任務執行後,將在機器中稍作等待,直至該批任務全部執行完畢。也就是說,同一批任務將在同一時刻完成。每個任務的費用是它的完成時刻乘以乙個費用係數 ci 。

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

【輸入】

第一行是 n。第二行是 s。

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

【輸出】

乙個數,最小的總費用。

【輸入樣例】51

1 33 2

4 32 3

1 4【輸出樣例】

153【提示】

樣例說明:

分組方案為,,,則完成時間為 ,費用 c=,總費用為 153。

對於全部資料,1≤n≤5000,0≤s≤50,1≤ti,ci≤100。

思路:先設定出一般的轉移方程:

f[i][j]表示把前i個任務分成j批執行的最小費用

f[i][j]=min(f[k][j-1]+(sum[i]+sj)(c[i]-c[k]))

複雜度o(n^3)

考慮優化一下,這裡介紹乙個經典思想:費用提前計算

我們可以不直接求每批任務的完成時刻,而是在一批任務的開始對後續產生影響時,就把費用加進結果中

如果用上面的方法,那麼轉移方程就變成了:

f[i]表示把前i個任務分成若干批的最小費用

f[i]=min(f[j]+sum[i](c[i]-c[j])+s(c[n]-c[j]))

上面的式子表示我們先不考慮s的影響,求出最小費用,再加上s對於j後面的數的影響即可

**:

#include#define ll long long

#define maxn 5020

using namespace std;

int f[maxn],a[maxn],c[maxn],suma[maxn],sumc[maxn];

int n,s;

int main()

memset(f,0x3f,sizeof(f));

f[0]=0;

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

cout

}

第4周任務1

程式頭部注釋開始 程式的版權和版本宣告部分 檔名稱 sanjiaoxing.cpp 作 者 鄒議鵬 完成日期 2012 年 3 月 14 日 版 本 號 41.vc 對任務及求解方法的描述部分 輸入描述 問題描述 程式輸出 程式頭部的注釋結束 include include math.h using...

第七周 任務1

include using namespace std class time 下面寫出靜態成員的初始化及各成員函式的成員 int main bool time is 24 true bool time from0 false time time int h,int m,int s void time...

第七周任務1

對任務及求解方法的描述部分 問題描述 學會使用靜態資料成員和靜態成員函式 程式頭部的注釋結束 include include includeusing namespace std class time void show time 根據is 24和from0,輸出適合形式 20 23 5 8 23 ...