A DDL的恐懼(貪心演算法)

2021-10-03 20:21:03 字數 1853 閱讀 4847

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。

所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。

請你幫幫他吧!

input

輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。

每個測試用例以乙個正整數n開頭(1<=n<=1000),表示作業的數量。

然後兩行。第一行包含n個整數,表示ddl,下一行包含n個整數,表示扣的分。

output

對於每個測試用例,您應該輸出最小的總降低分數,每個測試用例一行。
sample input

3

33 3 3

10 5 1

31 3 1

6 2 3

71 4 6 4 2 4 3

3 2 1 7 6 5 4

sample output

0

35

hint

上方有三組樣例。

對於第一組樣例,有三個作業它們的ddl均為第三天,zjm每天做乙個正好在ddl前全部做完,所以沒有扣分,輸出0。

對於第二組樣例,有三個作業,它們的ddl分別為第一天,第三天、第一天。zjm在第一天做了第乙個作業,第二天做了第二個作業,共扣了3分,輸出3。

定義結構體ddl,其中元素分別代表每個ddl的日期和代表的分數。

利用貪心演算法,我們想讓有限的時間中完成更多ddl,得到更多分數。

本題簡單處在於每個ddl完成用時都是一天,所以在安排時間時,每天安排乙個ddl。如果從前向後安排每一天,給每一天選擇ddl,比較困難。所以,可以從另乙個角度思考:這個ddl安排在哪天完成?

若要這樣思考,再依據貪心策略,我們先對分值高的ddl進行安置,並同時要讓這個ddl對其他ddl的完成的影響最小。

所以,貪心策略為:對ddl進行分數的降序排列,從分數最高的ddl開始安排,從該ddl的截止日期開始從後向前尋找空閒日期,找到就放入,否則計入扣的總分中。

#include

#include

using

namespace std;

struct ddl

bool

operator

<

(const ddl &d)

const};

bool

push

(ddl *a,

int*p,

int j)

}return

false;}

intmain()

a[j]

.date=m;

}for

(int j=

0;j)//輸入完成

int p[maxd]=;

sort

(a,a+n)

;//按分數降序排列

int result=0;

//被扣的分數

for(

int j=

0;jcout<"\n";}

return0;

}

vector陣列自帶begin()、end()函式,但自己定義的結構體沒有!用sort函式時,要用位址表示頭尾。

過載《時,兩個const都要加上,否則可能出現ce。

貪心演算法一般只要選好貪心指標就不會有太大問題,難度也不會太大。但選擇乙個恰當的貪心指標很困難。

DDL的恐懼(貪心演算法)

小明有 n 個作業,每個作業都有自己的 ddl,如果小明沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以小明想知道如何安排做作業的順序,才能盡可能少扣一點分。input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整數n開頭 1 n ...

Week4作業 A DDL的恐懼 貪心

有n個作業 1 n 1000 每個作業都有自己的ddl與平時分。請安排做作業的順序,拿到最多的平時分。輸入 共t個測試樣例,每個測試樣例共三行,第一行為作業數量n,第二行n個數表示ddl,第三行n個數表示平時分。對ddl進行降序排序。從最後一天往前,給每一天安排要寫的作業。列舉到第i天時,將所有dd...

A DDL 的恐懼(貪心法 二分法)

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整...