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...