33,025
社区成员




#include <stdio.h>
int maxPositive(int *a,int n){
int b = 0,sum = 65535,flag = 1;
int i = 0;
while(i>=0 && i<n){
while(i<n && a[i]<=0){
i++;
}
if(i<n) b = 0;
while(i<n && a[i]>0){
b += a[i];
i++;
}
if(sum > b) sum = b;
}
return sum;
}
main(){
int a[10] = {5,4,-1,1,-1,-4,-5,2,4,2};
printf("%d\n",maxPositive(a,10));
}
1.先求前缀和,O(n)
2.从左到右遍历前缀和,同时维护一个BST,对于每个前缀和,在BST中查找比它小但是最接近它的元素,O(nlogn)。
重要的是维护这个BST的平衡性,所以几乎是必须得使用平衡二叉树,用Treap就够了,实际上,STL中的set支持了upperbound操作,可以直接使用set来解决,代码量也很少