C 題解 任務安排1

2021-10-12 14:00:15 字數 3362 閱讀 8959

有 n

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

機器會把這n

nn 個任務分成若干批,每一批包含連續的若干個任務。

從時刻0

00開始,任務被分批加工,執行第 i

ii 個任務所需的時間是 t

it_i

ti​。

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

ss 加上每個任務所需時間之和。

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

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

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

ic_i

ci​。

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

輸入格式

第一行包含整數 nnn。

第二行包含整數 sss。

接下來n行每行有一對整數,分別為 t

it_i

ti​ 和 c

ic_i

ci​,表示第 i

ii 個任務單獨完成所需的時間 t

it_i

ti​ 及其費用係數 c

ic_i

ci​。

輸出格式

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

資料範圍1≤n

≤5000

1≤n≤5000

1≤n≤50

00,0≤s

≤500≤s≤50

0≤s≤50,1≤

ti,c

i≤1001≤t_i,c_i≤100

1≤ti​,

ci​≤

100

輸入樣例

5

11 3

3 24 3

2 31 4

輸出樣例

根據題目描述,可以將任務劃分成若干批,每一批包含連續的若干個任務,且在每批任務開始前,機器需要 s

ss 的啟動時間。分析輸入樣例,可以將任務做如下劃分:

此時總費用=(3

+2+3

)×9+

(3+4

)×13=

72+91=

163=(3 + 2 + 3) \times 9 + (3 + 4) \times 13=72+91=163

=(3+2+

3)×9

+(3+

4)×1

3=72

+91=

163

也可以將任務做如下劃分:

此時總費用=(3

+2)×

5+(4

+2)×

12+4×

14=25+

72+56=

153=(3 + 2) \times 5 + (4 + 2) \times 12 + 4\times14=25+72+56=153

=(3+2)

×5+(

4+2)

×12+

4×14

=25+

72+5

6=15

3,此時總費用最小。

從上述分析可以看出,這是乙個典型線性dp求最小值問題。

f[i]表示處理完前i個任務,所有方案的最小值

不妨設j為前一批的最後乙個任務,那麼要計算f[i]可以分為下面幾部分:

每一批任務的開始都會增加乙個啟動時間s

ss,這會導致後面所有任務的完成時刻都增加s

ss,所以還需要在當前階段累加對後面所有任務帶來的額外影響,即s×(

sumc

n−su

mcj)

s\times (sum_-sum_)

s×(sum

cn​​

−sum

cj​​

)因此,狀態轉移方程可以表示為:

f [i

]=mi

n,0≤

j<

if[i]= min\\times(sum_-sum_)+s\times (sum_-sum_)\}, 0\le j \lt i

f[i]=m

in,0

≤j<

i狀態數:n

nn狀態計算時間複雜度:o(n

)o(n)

o(n)

總的時間複雜度為:o(n

2)=o

(25,000

,000

)o(n^2) = o(25,000,000)

o(n2)=

o(25

,000

,000

)

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

5010

;ll sumt[n]

, sumc[n]

;ll f[n]

;int

main()

//求最小值,要將陣列初始化為無窮大

memset

(f,0x3f

,sizeof f)

; f[0]

=0;//初始狀態

for(

int i =

1; i <= n; i ++

)for

(int j =

0; j < i; j ++

) f[i]

=min

(f[i]

, f[j]

+ sumt[i]

*(sumc[i]

- sumc[j]

)+ s *

(sumc[n]

- sumc[j]))

; cout << f[n]

<< endl;

return0;

}

任務安排1

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

1606 例 1 任務安排 1

1606 例 1 任務安排 1 時間限制 1000 ms 記憶體限制 524288 kb 提交數 203 通過數 149 題目描述 有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。從時刻 0 開始,任務被分批加工,執行...

P2365 任務安排 題解

p2365 任務安排 這道題有弱化版和強化版,這道題是弱化版 我們很容易能想到乙個 dp 方程 f p i 表示前 i 個取了 p 段的最優解,於是轉移方程 f p i min f p 1 j st i p ast s ast sf i sf j 這個轉移方程是 o n 3 的考慮怎麼優化 對於每次...