设为首页 加入收藏

TOP

acdream 1682(有环的最大连续和)
2015-11-21 01:04:45 来源: 作者: 【 】 浏览:2
Tags:acdream 1682 最大 连续

题意:有n个数字围成一个圈,然后从圆圈拿走连续的一些数,问拿走的数的和的最大值是多少。

题解:普通最大连续和的做法,如果前面累加的数加当前数是大于最大值就更新最大值,如果小于0就把累加值清零,这个是有环的,那么可以从两种情况考虑,一种是普通的最大连续和找到的最大值,另一种就是头尾拼接的,把所有数取相反数,然后找到最大连续和,那么用总和sum加这个数就是头尾拼接的最大值,取两种情况较大的就是解。

?

#include 
  
   
#include 
   
     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; }
   
  


?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Saving Beans HDU3037 ( 组合数+L.. 下一篇C++/SDK界面开发总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: