HDU-1003 Max Sum

题目链接:Max Sum

Max Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 311655    Accepted Submission(s): 74063

Problem Description

Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.

Input

The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).

Output

For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.

Sample Input

 

2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5

 

Sample Output

 

Case 1: 14 1 4 Case 2: 7 1 6

此题题意为:给出一个数列,求出这段数列中连续的一段数的最大值,如果有多段最大值相同,则取第一段输出

maxLeft和maxRight是最终的结果,thisSum是当前的值,
如果当前值小于0,将当前值重置为0,当前左端置为1

每次输入一个数,就将当前值加上这个数,如果当前值大于最大值,就让最大值变成当前值

最左端变成当前左端

如果说当前值小于零,重置当前左端为最右边

直到遇到一个当前值大于最大值的情况,才将当前左端和当前右端赋值给最大左端和最大右端

以下代码:

#include <stdio.h>
#include<iostream>
using namespace std;
int main(){
    int t, n, maxLeft, maxRight, maxSum, temp;
    int thisLeft, thisSum;
    scanf("%d", &t);
    for(int id = 1; id <= t; ++id){
        scanf("%d", &n);
        scanf("%d", &maxSum);
        thisLeft = maxLeft = maxRight =  0;
        thisSum = maxSum;
        if(thisSum < 0){ thisSum = 0; thisLeft = 1; }
        for(int i = 1; i < n; ++i){
            scanf("%d", &temp);
            thisSum += temp;
            cout<<"thissum="<<thisSum<<endl;
            cout<<"maxLeft="<<maxLeft<<endl;
            cout<<"maxRight="<<maxRight<<endl;
/*
2
5 -1 -2 -3 -4 -5

*/
            if(thisSum > maxSum){
                maxSum = thisSum;
                maxLeft = thisLeft;
                maxRight = i;
            }
            if(thisSum < 0){
                thisLeft = i + 1;
                thisSum = 0;
            }
        }
        printf("Case %d:\n%d %d %d\n", id, maxSum, maxLeft + 1, maxRight + 1);
        if(id != t) printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Helloirbd/article/details/86711885