题目大意:给一个序列,求最大连续和。
用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 }