題目描述:本題顯然是貪心實現,具體怎麼貪心呢!大概的思路就是:優先考慮懲罰更重的任務,在考慮每乙個任務的時候安排它在最靠近dll的時間完成。可以證明此題滿足貪心選擇性質,如此貪心策略也是正確的。現有乙個機器要處理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
輸出格式:
一行乙個數,即最小懲罰因子和。
首先將任務用乙個結構體表示,包含任務的 ddl 和懲罰 weight。然後建立乙個任務的thing
陣列,並且對陣列以weight
為關鍵字降序排序。
structnode 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()
測試用例
4113478
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 第二行...