题目描述
一共t组询问
给定一个大小为n的数组。可以将其划分成若干段(每段中至少有一个元素,若不进行划分,仅有一段),从左到右编号,第iii段中的每一个元素扩大到原来的i倍
求数组元素总和的最大值
题解:
倒着来看,如果在数组中的两个数加一个标志表示在不同组,增加一个标志,题目可转化为ans加上依次这个标志后面数组中所有数的总和,如果这个这几个数的后缀大于0则在前面增加一个标志,小于0则不增加标志.
#include<iostream>
using namespace std;
const int N=2e6+10;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
long long ans=0,tem=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=n;i>=1;i--){
tem+=a[i];
if(tem>=0||i==1)ans+=tem;//对于已经遍历整个数组的时候要特判,因为就算这时候小于0,也应该加上一次
}
cout<<ans<<endl;
}
}