题目
题解
两个变量:
- 记录正数和:初始化为0,碰到正数时添加该正数;碰到负数时与之求和,若和为正数,继续进行,若和为负数,变量置为0,并将所得结果添加到负数和。
- 记录负数和。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int T;
scanf("%d", &T);
while (T--) {
ll p = 0, q = 0;
ll t;
int n;
scanf("%d", &n);
rep(i, 1, n) {
scanf("%lld", &t);
if (t > 0) {
p += t;
} else if (t < 0) {
if (p == 0) q += t;
else if (p + t > 0) p += t;
else if (p + t <= 0) {
q += (p + t);
p = 0;
}
}
}
printf("%lld\n", -q);
}
return 0;
}
题外
刚开始想的比较复杂:先将所有连续的正数加起来,再将所有连续的负数加起来,然后寻找正数,并与其之后的负数进行求和。循环进行该步骤直到只剩下两个数字或者0。即得到答案。
实现过程中碰到了很多问题,之后发现并不需要这么麻烦,两个变量就可以解决,再来看当时的思路,真是——没睡醒啊hhhh。