偷懶的西西【推薦】

題目:

Description

高三數學作業總共有n道題目要寫(其實是抄),編號1..n,抄每道題所花時間不一樣,抄第i題要花a[i]分鐘。由於西西還要準備NOIP,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空着的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱爲一個空題段,它的長度就是所包含的題目數。這樣應付自然會引起數學老師的憤怒。數學老師發怒的程度(簡稱發怒度)等於最長的空題段長度。
現在,西西想知道他在這t分鐘內寫哪些題,才能夠儘量降低數學老師的發怒度。由於西西很聰明,你只要告訴他發怒度的數值就可以了,不需輸出方案。(Someone:那麼西西怎麼不自己寫程序?西西:我還在抄別的科目的作業……)

Input

第一行爲兩個整數n,t,代表共有n道題目,t分鐘時間。
以下一行,爲n個整數,依次爲a[1], a[2],... a[n],意義如上所述。

Output

僅一行,一個整數w,爲最低的發怒度。

Sample Input

17 11
6 4 5 2 5 3 4 5 2 3 4 5 2 3 6 3 5

Sample Output

3

Data Constraint

Hint

樣例解釋
分別寫第4,6,10,14題,共用時2+3+3+3=11分鐘。空題段:1-3(長度爲3), 5-5(1), 7-9(3),
11-13(3), 15-17(3)。所以發怒度爲3。可以證明,此數據中不存在使得發怒度<=2的作法。
數據範圍
60%數據 n<=2000
100%數據 0<n<=50000,0<a[i]<=3000,0<t<=100000000

題解&總結:

二分答案。
判斷答案是否合法。

怎麼判斷呢?
貪心顯然不行。
那就用DP吧。

我們現在要判斷二分出來的最大間隔(憤怒值)是否合法。

我們設fi表示做到第i個作業,且做了第i個作業的最小時間。

轉移方程顯然:fi=min{fj}  j=[i-x-1..i-1]  因爲上一次做的作業與這一次間隔不能超過x。

答案顯然爲ans=max{fj}  j=[n-x..n]

但是,如果直接這樣DP,會時超60分。
所以我們需要加優化。

我們可以發現,轉移中的fi=min{fj}  j=[i-x-1..i-1] 可以不需要枚舉都枚舉j。
其實只要維護一個區間內的最小值就可以了。

我們每次把fi-x-2丟出區間,然後得到fi後把fi加入區間。

維護區間的最小值,用堆和線段樹都可以。

我是用堆維護的,比賽時調了很久,
因爲要開兩個數組記錄堆裏面的位置與f數組裏面的位置的對應關係。
然後打着打着自己都差點被自己繞暈了。

當然,也可以用奇奇怪怪的單調隊列來優化。
聽說這題可以當做單調隊列的例題。
有興趣的可以去學學。


這題(第一題)堆維護調了近兩個小時。

第一題要不惜一切代價做對。
這是我比賽的原則。
也符合很多大型比賽的套路。
大型比賽第一題都最水。
如果大型比賽的第一題都做不對那還是回家睡覺吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章