UVa 10684

  题目大意:给一个序列,求最大连续和。

  用sum[i]表示前i个元素之和,那么以第i个元素结尾的最大连续和就是sum[i]-sum[j] (j<i)的最大值,也就是找前i-1个位置sum[]的最小值,因此只需要扫描一次数组,维护目前遇到的最小sum即可。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7 #ifdef LOCAL
 8     freopen("in", "r", stdin);
 9 #endif
10     int n;
11     while (scanf("%d", &n) && n)
12     {
13         int sum = 0, lmin = 0;
14         int x, ans = -10000;
15         for (int i = 0; i < n; i++)
16         {
17             scanf("%d", &x);
18             sum += x;
19             ans = max(ans, sum-lmin);
20             lmin = min(sum, lmin);
21         }
22         if (ans > 0)  printf("The maximum winning streak is %d.
", ans);
23         else  printf("Losing streak.
");
24     }    
25     return 0;
26 }
View Code