原题链接 :
思路 :
创建一个后缀和数组 , 然后把所有后缀和>0的加入到答案中,注意,整个数组的和一定要加入答案中 ;
代码
java :
package sf;
import java.util.Scanner;
import java.util.* ;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int t = sc.nextInt() ;
StringBuilder sb = new StringBuilder() ;
while(t--!=0){
int n = sc.nextInt() ;
long[] a = new long[n + 1] ;
long[] ed = new long[n+1] ;
for(int i=1;i<=n;i++){
a[i] = sc.nextInt() ;
}
ed[n] = a[n] ;
for(int i=n-1;i>=1;i--){
ed[i] = ed[i+1]+a[i] ;
}
long ans = ed[1] ;
for(int i=2;i<=n;i++){
if(ed[i]>0){
ans += ed[i] ;
}
}
sb.append(ans).append('\n') ;
}
System.out.println(sb);
sc.close() ;
}
}
C++
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
const int N = 2e5 + 10 ;
LL a[N] ,ed[N] ;
inline void solve(){
int n ; cin >> n ;
for(int i=1;i<=n;i++) cin >> a[i] ;
ed[n] = a[n] ;
for(int i=n-1;i>=1;i--) ed[i] = ed[i+1]+a[i] ;
LL ans = ed[1] ;
for(int i=2;i<=n;i++){
if(ed[i]>0){
ans += ed[i] ;
}
}
cout << ans << endl ;
}
signed main(){
IOS
int _ = 1;
cin >> _;
while(_ --) solve();
return 0;
}