青藤 10281 最佳排程問題

2021-10-14 07:46:08 字數 2351 閱讀 3241

直接放圖吧:

這是我第一次寫的**:

#include

using

namespace std;

int n, m, mac[

10001

], time[

10001

], ans = int_max /

3, min = int_max /

3, now =0;

intsetnow()

void

dfs(

int d)

for(

int i =

1; i <= m; i++)}

bool

compare

(int a,

int b)

intmain()

洞可能有些多,一步步慢慢來:

這一段→→→

int

setnow()

能否優化?

因為我們發現,當時更新的只是mac[i],所以只要比較mac[i]即可。

#include

using

namespace std;

int n, m, mac[

10001

], time[

10001

], ans = int_max /

3, min = int_max /

3, now =0;

void

dfs(

int d)

for(

int i =

1; i <= m; i++)}

bool

compare

(int a,

int b)

intmain()

繼續看:

now =

max(now, time[d]);

if(now >= ans)

return

;dfs

(d +1)

; mac[i]

-= time[d]

; now =

min(now, time[d]

);

now實質上是不可逆的,例如:

mac[1]

mac[2]

nowtime[i]102

1020

經過:

now =

max(now, time[d]

);

更新:

mac[1]

mac[2]

nowtime[i]

1022

2220

再經過:

now =

min(now, time[d]

);

卻變成了

mac[1]

mac[2]

nowtime[i]102

220所以我們要乙個臨時變數儲存。

if

(now >= ans)

return

;

難道放在mac[i]不成立,後面的機器都被拋棄了嗎?

剪枝:

for

(int i =

1; i <= m; i++

) min =

max(min, mac[i]

);

#include

using

namespace std;

int n, m, mac[

10001

], time[

10001

], ans = int_max /3;

void

dfs(

int d,

int now)

int new;

for(

int i =

1; i <= m; i++

)dfs

(d +

1, new)

; mac[i]

-= time[d];}

}bool

compare

(int a,

int b)

intmain()

ac。

最佳排程問題

假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n和k。第2 行的n...

最佳排程問題

假設有n個任務由k個可並行工作的機器完成,完成任務i需要的時間為ti,對任意給定的整數n和k,以及完成任務i需要的時間ti,設計乙個演算法,求完成這n個任務的最佳排程,使得完成全部任務的時間最早。第一行有2個正整數n和k,第二行有n個正整數,表示ti n 7000,c樣例輸入7 3 2 14 4 1...

PTA 最佳排程問題

假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n和k。第2 行的n...