貪心 ddl(題解)

2021-10-03 21:54:07 字數 1785 閱讀 7643

題意

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。

思路

貪心的思想

因為每一項作業完成需要的時間相同,所以先完成分數多的扣的分越少,為了完成盡可能多的任務,可以從後向前遍歷t(從後向前這樣對其他作業的影響小),判斷哪些任務可以完成

總結:貪心思想。根據不同資料範圍進行優化

1.遍歷分數,遍歷時間,時間複雜度o(n^2)

2.遍歷時間 ,利用最大堆(每遍歷乙個t,將該t對應的任務壓入堆中(堆中元素:當前可以完成但未完成),遇到乙個合適的t便彈出最大元素。時間複雜度o(nlogn)

反思:根據不同資料範圍選擇合適的方法,比如想到1時複雜度高,那麼想想哪個資料結構可以降到logn或者n;對於每次選取最大元素可以想到最大堆,那麼遍歷t時,能不能直接得到在該t可以放的元素,可以想到桶排直接o(1)獲取。

**

//o(n^2)兩次遍歷

#include

#include

#include

#include

using

namespace std;

struct point

}q[1050];

bool vis[

1050];

intmain()

for(

int i=

1;i<=num;i++

)sort

(q+1

,q+num+1)

;int sum=0;

for(

int j=

1;j<=num;j++

)//o(n^2)}if

(flag==

0)

sum=sum+q[j]

.score;

} cout<}return0;

}

//o(nlogn)

#include

#include

#include

#include

#include

using

namespace std;

struct point};

vector<

int> q[

1020];

int a[

1002];

int b[

1002];

intmain()

*/for

(int i=

1;i<=num;i++

) cin>>a[i]

;for

(int i=

1;i<=num;i++

) cin>>b[i]

;for

(int i=

1;i<=num;i++

) q[a[i]].

push_back

(b[i]);

for(

int i=

1000

;i>=

1;i--

)//o(nlogn)

int sum=0;

while

(!pri.

empty()

)cout<}return0;

}

DDL 的恐懼(貪心)

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

DDL的恐懼(貪心演算法)

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

培訓貪心題解

在第乙個城市加滿,之後每到乙個城市加一公升油,直到滿足最低油耗量。注意有可能在第乙個城市就超過最低油耗量。include using namespace std int main 使用k次最大值的表情,再使用一次第二大值的表情,迴圈直到m次。include using namespace std l...