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,為測試用例的數量。每個測試用...