P3102取数
问题描述
n个整数组成的一个环,现在要从中取出m个数,取走一个数字就不能取跟它相邻的数字(相邻的数不能同时取)。要求取出的数字的总和尽可能大,问这个最大和是多少? 如果无解,请输出“Error!”
输入格式
第一行包含两个正整数n、m。
第二行为n个整数Ai。
输出格式
仅一个整数,表示所求结果。如果无解输出“Error!”,不包含引号。
样例输入
8 4
8 5 6 2 3 4 8 9
样例输出
25
提示
对于全部数据:m<=n;-1000<=Ai<=1000
N<=200000
此题容易想到dp,然而dp的复杂度是$n^2$的,显然不能通过。
正解是用堆维护。
我们将每个元素编号1-tot,记录它左边元素,右边元素,本身的值。
将它的值和编号加入堆中,每次取出堆顶可用元素,将它,它左边元素,它右边元素标记为不可用。
这样做显然是不对的,因为我们无法解决$2 \ 4 \ 3$这种情况。
为了解决这种情况,我们每次取出一个点后,要向堆中加入一个点,
这个点的编号是tot++,值等于左边元素+右边元素-中间元素。
这个点代表的意义就是选择左边元素和右边元素,而不选择中间元素。
代码:
1 |
|