描述
ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。
自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?
输入
第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分。
第2行, N 个整数 A1, A2, ..., AN (0 ≤ |Ai| ≤ 104), 序列。
输出
一个整数,最大的和。
样例输入
5 2
2 -3 2 -1 2
样例输出
5
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
void paixu(int c[100000][3],int j){
for(int i = 0;i < j;i++){
for(int k = i + 1;k <= j;k++){
if(c[i][0] > c[k][0]){
int x = c[i][0];
c[i][0] = c[k][0];
c[k][0] = x;
x = c[i][1];
c[i][1] = c[k][1];
c[k][1] = x;
x = c[i][2];
c[i][2] = c[k][2];
c[k][2] = x;
}
}
}
}
int main(){
int n,m;
cin >> n >> m;
int a[100000];
int b[100000];
int c[100000][3];
int j = 0;
int zheng = 0,fu = 0;
int zhenghe = 0;
for(int i = 0;i < n;i++){
b[i] = 0;
}
for(int i = 0;i < n;i++){
cin >> a[i];
if(a[i] * b[j] >= 0){
b[j] += a[i];
}
else{
j++;
b[j] += a[i];
}
}
for(int i = 0;i <= j;i++){
if(b[i] >= 0){
zheng++;
zhenghe += b[i];
}
}
for(int i = 0;i <= j;i++){
c[i][0] = abs(b[i]);
c[i][1] = i;
if(b[i] >= 0) c[i][2] = 1;
else c[i][2] = 0;
}
int h = j;
int qq = 0;
while(1){
paixu(c,h);
if(zheng <= m){
cout << zhenghe << endl;
return 0;
}
else{
if(c[qq][2] == 1){
zheng--;
zhenghe = zhenghe - c[qq][0];
}
else if(c[qq][2] == 0){
if(c[qq][1] == 0 || c[qq][1] == h){
qq += 1;
}
else{
zheng--;
zhenghe -= c[qq][0];
c[qq][0] = c[qq][0] + c[c[qq][1] - 1][0] + c[c[qq][1] + 1][0];
for(int i = c[qq][1] - 1;i <= h;i++){
c[i][0] = c[i + 1][0];
c[i][1] = c[i + 1][1];
c[i][2] = c[i + 1][2];
}
for(int i = c[qq][1] + 1;i <= h;i++){
c[i][0] = c[i + 1][0];
c[i][1] = c[i + 1][1];
c[i][2] = c[i + 1][2];
}
h--;
}
}
}
}
return 0;
}