Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 172675 Accepted Submission(s): 40223
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
分析:
这是一道求最大子段和的问题.
定义一个初始值为-1001的max(测试数据最小为-1000)从第一个数开始累加sum,
每次累加之后与max打擂,若大于则更新子段的终止位置。
若sum<0则丢弃之前的子段,从终止位置的下一位置重新开始;
直到再找到一个更大的子段,更新起始位置;
第一次做的时候在sum<0时直接就更新了起始位置到当前位置的下一位置,导致WA。
(应该确保之后找到了更大的子段和时才更新起始位置。)因此纠结了好半天;
代码:
#include<iostream>
using namespace std;
int main()
{
int k;
cin >> k;
for (int j = 1;j <= k;j++)
{
int begin = 1, end, begin_t=1;
int sum = 0, max = -1001,shuru;
int n;
int i;
cin >> n;
for (i = 1;i <= n;i++)
{
scanf_s("%d", &shuru);
sum += shuru;
if (sum > max)
{
max = sum;
end = i;
begin = begin_t;
}
if (sum < 0)
{
sum = 0;
begin_t = i + 1;
}
}
printf("Case %d:\n", j);
printf(j==k ? "%d %d %d\n" : "%d %d %d\n\n", max, begin, end);
}
return 0;
}