單位時間的排程問題 貪心

2022-06-29 10:18:12 字數 2263 閱讀 9863

題目描述:

現有乙個機器要處理n項任務,每項任務都可以在乙個單位時間內完成。每項任務有截止時間(d1, d2,,…, dn),和超過截止時間內未完成的懲罰因子(w1, w2,,…, wn)。求所有任務排列中最小的懲罰因子和。例如若有3項任務,其截止時間為(2,2,2),懲罰因子為(6,7,8)。排列123,132,213,231,312,321的懲罰因子和為分別是8,7,8,6,7,6。可見6是所有任務排列中懲罰因子最小和為6。

輸入格式:

共三行,第一行為乙個整數n(0

輸出格式:

一行乙個數,即最小懲罰因子和。

本題顯然是貪心實現,具體怎麼貪心呢!大概的思路就是:優先考慮懲罰更重的任務,在考慮每乙個任務的時候安排它在最靠近dll的時間完成。可以證明此題滿足貪心選擇性質,如此貪心策略也是正確的。

首先將任務用乙個結構體表示,包含任務的 ddl 和懲罰 weight。然後建立乙個任務的thing陣列,並且對陣列以weight為關鍵字降序排序。

struct

node thing[maxn];

bool cmp(struct node x, struct

node y)

對輸入的處理和各種陣列的初始化我放到乙個 init() 函式中實現。為了方便安排時間段,定義乙個時間槽:用陣列 done來表示。若 done= true,則表示第 i 個單位時間段是空閒的。所以應該初始化 done 全為 true,每次分配乙個時間就賦值為 false

以避免衝突。

void

init()

按照我們排序後的順序(即優先考慮懲罰更重的任務),依次考慮每乙個任務,安排它在最靠近 dll 的時間完成。如果找不到,就無法完成。

/*

為任務t尋找合適的時間

* 找不到則返回false

*/bool done(struct

node t)

//找不到則返回假

return

false;}

intcalc()

return

ans;

}

下面附上完整**測試用例

#include #include 

#define maxn 10050

using

namespace

std;

intn;

bool done[maxn]; //

第i個時間段是否有空

struct

node thing[maxn];

bool cmp(struct node x, struct

node y)

void

init()

/*為任務t尋找合適的時間

* 找不到則返回false

*/bool done(struct

node t)

//找不到則返回假

return

false;}

intcalc()

return

ans;

}int

main()

測試用例

411

3478

910輸出:742

22116

782輸出:95

5522

31231

29輸出:063

3344

4789

1213輸出:48

1112

2233

1231

3354

輸出:1032

2267

8輸出:64

1123

1279

輸出:161

3446

121220

92515輸出:156

6141

4304

5101623

輸出:474

2431

467060

5040

3020

10輸出:

50

貪心 加工生產排程(雙機排程貪心問題)

時間限制 1 sec 記憶體限制 64 mb 提交 41 解決 21 提交 狀態 討論版 命題人 外部匯入 題目描述 有n個部件需在a b機器上加工,每個工件都必須經過先a後b兩道工序。已知 部件i在a b機器上的加工時間分別為ai,bi。問 如何安排n個工件的加工順序,才能使得總加工時間最短?輸入...

貪心 任務排程問題

問題描述 假設給定n個任務的集合t,每個任務i有啟動時間si和完成時間fi si問題分析 要求 在最少的機器上安排完所有任務。如何選擇貪心策略才能使問題的解為最優解?顯然,開始時間最早的任務需要被先執行,但是最優解要求我們使用的機器最少,因此我們每次選擇時應盡量使用相同的機器。若已使用過的機器上現處...

區間排程問題(貪心)

問題描述 有n項工作,每項工作分別在si開始,ti結束。對每項工作,你都可以選擇參加或不參加,但選擇了參加某項工作就必須至始至終參加全程參與,即參與工作的時間段不能有重疊 即使開始的時間和結束的時間重疊都不行 問最多可以完成多少項工作?限制條件 1 n 100000 1 si ti 10 9 第二行...