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

2021-10-03 20:18:58 字數 1518 閱讀 4235

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

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

請你幫幫他吧!

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

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

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

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

3 3 3

10 5 1

31 3 1

6 2 3

71 4 6 4 2 4 3

3 2 1 7 6 5 403

5上方有三組樣例。

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

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

1、因為該題n的資料大小為1~1000,所以可以設計o(n^2)的演算法,當資料大小為1e6時,必須設計o(nlogn)的演算法

2、easy版解法(n<=e^3)

將 n 個 deadline 根據分數從大到小排序,依次遍歷 對於第 ? 個 deadline,根據 ?? 從後往前遍歷,一旦找到空閒時段則安排為第 ? 個 deadline

3、hard版解法(n<=e^6)

從後往前列舉每一天,給每一天安排任務

列舉到第 x 天時,將所有 ti=x 的 deadline 加入最大堆中

再從最大堆中選取乙個價值最大的 deadline 安排在第 x 天

1、注意continue是跳過一次迴圈,break是跳出整個迴圈

2、在easy版**中,將struct zuoye按扣分從大到小排序後,逐次為最大的扣分作業選取區間時,需要從ddl開始往前找到第乙個合適的區間放置,而非從前往後找。

#include

#include

using

namespace std;

struct zuoye

}zy[

1000];

intmain()

,score=0;

scanf

("%d"

,&n)

;for

(int j=

0;j) cin>>zy[j]

.ddl;

for(

int j=

0;j) cin>>zy[j]

.koufen;

sort

(zy,zy+n)

;for

(int j=

0;jif(flag==0)

flag=0;

} cout<}return0;

}

後期我會補上qaq

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...