生日礼物

2288: 【POJ Challenge】生日礼物

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 284  Solved: 82
[Submit][Status]

Description

 

ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。

自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?

Input

 

第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分。

第2行, N 个整数 A1A2, ..., AN (0 ≤ |Ai| ≤ 104), 序列。

Output

 

 

一个整数,最大的和。

Sample Input


5 2 
2 -3 2 -1 2

Sample Output

5
 
 
 
WAY:
(这题真的是看了我,好久。
就算看解析也是半天不能接受。(感觉就是不能理解)。
呈现在头脑清醒。赶紧的,多写点。)
 
首先上ZYF的题解

"感觉和数据备份这题有点像,但是又转化不过来。。。看了hzwer的题解之后恍然大悟了。。。

首先连在一块的正负相同的肯定可以看成一个点,然后我们就得到了一个正负交替的数列,并且首位两项都是正数(负数去掉)

然后如果正的项数<=m,那显然我们全部选走就获得了最大权值,否则我们需要做一点牺牲。

1)不选某些正项

2)选一些负项使得相邻的正项成为1块

记所有正数之和为sum,我们需要进行上面两种操作使得sum减掉的数最小并且满足只有m块。

我们把所有数的绝对值放入一个堆,每次取最小元素x。sum'-=x

那么如果该数原来是正的,意思是不选它;

如果是负的,意思是把它两边的正数合并。

但直接这样做是不行的,我们必须保证取负的时候两边的正的必须不被取,取正的时候两边的负的不被取。

换句话说,不能选择相邻的两个数!我们成功的将此题转化成了数据备份问题。"

如果已经懂了的话。那就没必要看下面了。

or还没有懂吧。

let me explain 一下:

|+-+| - |+| - |+| - |+| -+

举个例子。如上图 我们6个正数,选4个块。加入这就是选出来的最优答案。我们分析一下,用什么方法可以选出这个答案。

首先,之前如果正的项数<=m,那显然我们全部选走就获得了最大权值。

这个简单易懂的就不考虑了。

 

加入,我们的M<正数个数(X)

那么,我们可以:

1.我们一定会选择M个块 不可能选择小于M个块!(自己easily证明)

2.于是,假设我们选择M个,都是单块(每块就是一个正数),那么就有X-M个正数没有被选。

3.于是,假如在2的基础上,我们就希望 那些不被选择的正数是最小的。(一看便知)

4.但是实际情况并不是 选择的单块。连块可以怎么选出来。

5.假如我们不选择那个连块,那个连块就会被分开,意思就是我们会浪费一次选择的机会。(我们相当多了一个正数需要被删除)

但是我们actually选择了连块而不是去删除另外一个正数) 说明什么呢?(比较一下 两者的cost

删负数 就是 减去 abs("-") 删正数就是减去abs("+") ,我们倘若选择连块就是说明 abs("-") < abs("+) )

所以上面的贪心策略就成立了。

同时,删除负数意味着将旁边的两个正数合并成了一个(等效于删除了一个正数)(也就是我们用了一次X-M次删除机会中的一次)

so,我们手动合并一个新的正数。然后情况又是重复的了。(这就是和数据备份一个思想了)(好绕啊,感觉自己说的).

 

同时,(可能会有和数据备份一样的问题)(所以我们需要检验一下,合成了新的正数("+")之后,倘若又一次把它删去,相当于还是进行了两步操作(把之前的那一次操作后悔掉了)。是符合我们的算法的。所以算法就非常完美了。).

 
 
posted @ 2016-03-18 17:39  A_Cherry  Views(245)  Comments(0)    收藏  举报