HDU

来源:互联网 发布:震动报警器单片机程序 编辑:程序博客网 时间:2024/06/14 00:17

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1231

解题思路:到达一个新位置的时候,如果他前面的序列和为负,那么我们一定是舍弃它的,所以重新以这个位置为起点。如果前面的序列为正,那么就把这个数字加入,然后与maxsum比较,大的话则更新

AC代码:

#include<cstdio>using namespace std;const int MAXN = 10000 + 5;int arr[MAXN];int main(){    for (int k;scanf("%d", &k) == 1&&k;)    {        bool flag = 0;        for (int i = 0;i < k;i++)        {            scanf("%d", arr + i);            if (arr[i] >= 0) flag = 1;        }        int presum = 0, maxsum = -1, begin = 0, ansi=0, ansj=0;        for (int i = 0;i < k;i++)        {            if (presum < 0)            {                presum = 0;                begin = i;            }            presum += arr[i];            if (presum > maxsum)            {                maxsum = presum;                ansi = begin;                ansj = i;            }        }        if (flag)            printf("%d %d %d\n", maxsum, arr[ansi], arr[ansj]);        else            printf("0 %d %d\n", arr[0], arr[k - 1]);    }    return 0;}
原创粉丝点击