码迷,mamicode.com
首页 > 其他好文 > 详细

acdream 1682(有环的最大连续和)

时间:2015-04-16 01:31:42      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:高效算法

题意:有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;
}


acdream 1682(有环的最大连续和)

标签:高效算法

原文地址:http://blog.csdn.net/hyczms/article/details/45066861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!