1. 程式人生 > >Luogu_1280_尼克的任務

Luogu_1280_尼克的任務

題目描述

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由一個開始時刻與一個持續時間構成。

尼克的一個工作日為N分鐘,從第一分鐘開始到第N分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的一個來做,而其餘的則由他的同事完成,反之如果只有一個任務,則該任務必需由尼克去完成,假如某些任務開始時刻尼克正在工作,則這些任務也由尼克的同事完成。如果某任務於第P分鐘開始,持續時間為T分鐘,則該任務將在第P+T-1分鐘結束。

寫一個程式計算尼克應該如何選取任務,才能獲得最大的空暇時間。

輸入輸出格式

輸入格式

輸入資料第一行含兩個用空格隔開的整數N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作時間,單位為分鐘,K表示任務總數。

接下來共有K行,每一行有兩個用空格隔開的整數P和T,表示該任務從第P分鐘開始,持續時間為T分鐘,其中1≤P≤N,1≤P+T-1≤N。

輸出格式

輸出檔案僅一行,包含一個整數,表示尼克可能獲得的最大空暇時間。

樣例

INPUT

15 6
1 2
1 6
4 11
8 5
8 1
11 5

OUTPUT

4

HINT

SOLUTION

dp

這題的轉移方式非常簡單,就是兩個式子:
當前時刻沒有工作開始我們就從前一個時刻轉移:\(dp[i]=dp[i+1]+1\)


當前時刻有工作開始我們從所有(以當前時刻為開始時刻的工作的)結束時間(區間對應的\(r\))轉移:\(dp[i]=Max(dp[i],dp[i+len])\)\(i+len\)就是前文的\(r\))。

這裡按這種轉移方式的話,我們是應該逆著轉移的。

然後我就怎麼也想不明白為什麼不能順著推。花了我一下午,qwq。

如圖:

你看上面的線段,如果我順著推的話,我們由AB,EF組成的更優的答案就會被CD在轉移過程中覆蓋掉,但是在逆著推的情況下,我們AB,EF組成的答案就會作為更優解被保留下來。
對就是這樣qwq。

總而言之,對於每一個任務結束時的情況我們是不能覆蓋掉的,最優解只能從不同任務結束時轉移而來,因為我們這一題的本來就是要在空閒時遇到任務就必須要接任務

,但是又沒有規定任務結束的時間。

換而言之,我們的答案是沿著我們規定的方向轉移來的,但是,最先開始的任務規定了一定要接,而沒有任何規定說最後結束的任務一定要接,所以我們的解一定會包含最開始的任務,卻不一定會包含最後結束的任務,這就是區別。