1. 程式人生 > >【BZOJ2288】生日禮物 [貪心]

【BZOJ2288】生日禮物 [貪心]

zoj data amp ont 神奇 rip des 分享 超過

生日禮物

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 694 Solved: 218
[Submit][Status][Discuss]

Description

  ftiasch 18歲生日的時候,lqp18_31給她看了一個神奇的序列 A1, A2, ..., AN. 她被允許選擇不超過 M 個連續的部分作為自己的生日禮物。

  自然地,ftiasch想要知道選擇元素之和的最大值。你能幫助她嗎?

技術分享

Input

  第1行,兩個整數 NM , 序列的長度和可以選擇的部分。

  第2行, N 個整數 A1, A2, ..., AN , 序列。

Output

  一個整數,最大的和。

Sample Input

  5 2
  2 -3 2 -1 2

Sample Output

  5

HINT

  1 ≤ N ≤ 105, 0 ≤ M ≤ 105, 0 ≤ |Ai| ≤ 104

Solution

  首先,我們可以把權值正負相同的連續的一段合並起來。Ans+=(所有正數),塊數++。

  然後把每一段的絕對值加入到小根堆裏面。每次貪心取出最小的來,塊數減去 1 直到滿足題目要求

為止。

  為什麽這樣可以對呢?我們來討論一下:

    1. 如果刪去的段是正數, 那麽相當於不取這個

    2. 如果刪去的段是負數,那麽相當於取了這個段合並它左右的兩個段。

  但是!這樣會有一個問題!就是無法考慮連續取5個段及以上的情況。

  所以判斷一下,每次取負數段的時候,刪去左右兩個小段加上一個大段他們三個合並的值)即可。

【BZOJ2288】生日禮物 [貪心]