题意:有n个数字围成一个圈,然后从圆圈拿走连续的一些数,问拿走的数的和的最大值是多少。
题解:普通最大连续和的做法,如果前面累加的数加当前数是大于最大值就更新最大值,如果小于0就把累加值清零,这个是有环的,那么可以从两种情况考虑,一种是普通的最大连续和找到的最大值,另一种就是头尾拼接的,把所有数取相反数,然后找到最大连续和,那么用总和sum加这个数就是头尾拼接的最大值,取两种情况较大的就是解。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 200010;
int n, s[N];
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
int sum = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &s[i]);
sum += s[i];
}
int res = 0, maxx = 0;
for (int i = 1; i <= n; i++) {
res += s[i];
if (res > maxx)
maxx = res;
if (res < 0)
res = 0;
}
for (int i = 1; i <= n; i++)
s[i] = -1 * s[i];
int res2 = 0, maxx2 = 0;
for (int i = 1; i <= n; i++) {
res2 += s[i];
if (res2 > maxx2)
maxx2 = res2;
if (res2 < 0)
res2 = 0;
}
printf("%d\n", max(maxx, sum + maxx2));
}
return 0;
}