小明有 n 個作業,每個作業都有自己的 ddl,如果小明沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。
所以小明想知道如何安排做作業的順序,才能盡可能少扣一點分。
input:輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。樣例輸入:每個測試用例以乙個正整數n開頭(1<=n<=1000),表示作業的數量。
然後兩行。第一行包含n個整數,表示ddl,下一行包含n個整數,表示扣的分。
output:
對於每個測試用例,您應該輸出最小的總降低分數,每個測試用例一行。
333
33105
1313
1623
7146
4243
3217654
樣例輸出:
0
35
hint上方有三組樣例。
對於第一組樣例,有三個作業它們的ddl均為第三天,小明每天做乙個正好在ddl前全部做完,所以沒有扣分,輸出0。
對於第二組樣例,有三個作業,它們的ddl分別為第一天,第三天、第一天。小明在第一天做了第乙個作業,第二天做了第二個作業,共扣了3分,輸出3。
首先這明顯是乙個貪心問題,我們首先要確定乙個貪心策略。我們通過分析題目,了解到目的是盡可能少的扣分,那麼我們就想到優先把分值高的題目完成,而不是先完成ddl靠前的,這裡我們可以舉乙個反例:
如果我們優先完成ddl靠前的題目的話,並且對於ddl相同是優先完成分值大的題目,那麼對於上圖,我們最終扣的分數為100,如果完成分值高的題目,那麼我們最終扣的分數為1,這樣就說明我們優先完成分值高的題目的貪心策略是可行的。
對於演算法實現,我們課以用乙個結構體才儲存乙個題目的資訊,在輸入資訊的同時,記錄所有題目分數之和,如果我們完成某個題目,就可以將該題目的分數從分數和中減去,這樣剩餘的分數就是我們扣的分。
在我們輸入結束後,按題目的分值進行降序排序,之後我們就優先給分值最高的題目去找完成時間,在尋找時間是,應該從該題目的ddl開始向前遍歷,因為這樣才能對其他的題目影響最小。
ps:
這種方法只適合資料範圍比較小的題目,如果資料範圍較大,肯定會超時,那麼我們可以採用大根堆的方法,將複雜度降到nlo
gnnlogn
nlogn。
#include
#include
#include
using
namespace std;
struct info };
info all[
1001];
int theday[
1001];
//當前有沒有完成題目
intmain()
for(
int i =
0; i < number; i++
)sort
(all, all + number)
;//按分數由大到小排序
for(
int i =
0; i < number; i++)}
} cout << score << endl;
}}
DDL 的恐懼(貪心)
zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整...
A DDL的恐懼(貪心演算法)
zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...