DDL 的恐懼(貪心)

2021-10-04 01:31:46 字數 1583 閱讀 2101

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

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

請你幫幫他吧

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

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

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

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

333

33105

1313

1623

7146

4243

3217

654

0

35

上方有三組樣例。

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

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

這是乙個貪心問題,注意要點是:1.作業一天可以做完。2.輸出結果是最小的總降低分數。

由於每個作業都是一天就可以做完,不存在區間問題,那我們就可以優先選擇分數較高的先完成。但是我們應該盡量讓完成的任務不會妨礙到其他任務的完成,因此還要ddl靠後的盡量往後推。

那麼我們就可以考慮從後往前列舉天數,第i

ii天完成ddl

≥i

ddl\ge i

ddl≥

i的任務中,價值最大的任務,因此,我們可以將第i

ii天為ddl的任務加入最大堆中,然後取出最大堆中的分數最大的元素(該元素可能屬於第i

ii天,也可能屬於第j

jj天(j≥

i)

(j\ge i)

(j≥i

))。將取出的這些元素加在一起就是完成的分數,然後由總分數減去完成的分數,就是降低的分數。

更多細節見下方**。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1000+1

;struct node

;priority_queue<

int> q;

node a[maxn]

;int t,n,antians,ansplus;

bool

comp

(node a,node b)

intmain()

}if(!q.

empty()

)//今天可以做乙個任務

} cout<}return0;

}

DDL的恐懼(貪心演算法)

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

貪心 ddl(題解)

題意 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。思路 貪心的思想 因為每一項作業完成需要的時間相同,所以先完成分數多的扣的分越少,為了完成盡可能...

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

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