HDU 1003

简介: Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 105228    Accepted Submission(s): 242...

Max Sum

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


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
View Code
//第二组错误,输出了 7 7
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 100010;

int ans[maxn] = {0};
int b[maxn][2] = {0};
int a[maxn];

int main()
{
    int i,j,k;
    int T;
    scanf("%d",&T);
    int n,m;
    int num;
    int flag = 1;
    int temp = T;
    while(T--)
    {
        scanf("%d",&num);
        memset(ans,0,sizeof(ans));
        memset(b,0,sizeof(b));
        memset(a,0,sizeof(a));


        for(i=1; i<=num; i++)
            scanf("%d",a+i);
        ans[1] = a[1];
        b[1][0] = b[1][1] = 1;
        int max = -1;
        int next;
        for(i=2; i<=num; i++)
        {
            if(ans[i-1]>0)
            {
                ans[i] = ans[i-1] + a[i];
                //if(a[i]>0)
                {
                    b[i][0] = b[i-1][0];
                    b[i][1] = i;
                }
               // else
               // {
               //     b[i][0] = b[i-1][0];
               //     b[i][1] = i-1;
               // }
            }
            else
            {
                ans[i] = a[i];
                b[i][0] = b[i][1] = i;
            }
            if(ans[i]>max)
            {
                max = ans[i];
                next = i;
            }

        }
        printf("Case %d:\n",flag);
        printf("%d %d %d\n",max,b[next][0],b[next][1]);
        if(flag<temp)
            printf("\n");
        flag++;
    }
    return 0;
}
 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int maxn = 100010;
 6 int a[maxn] = {0};
 7 
 8 int main()
 9 {
10     int i,j,k;
11     int T;
12     scanf("%d",&T);
13     int num;
14     int flag = 1;
15     int sum = 0;
16     int start,end,last;
17     int temp = T;
18     while(T--)
19     {
20         
21         int max = (1<<31);
22         scanf("%d",&num);
23         memset(a,0,sizeof(a));
24         sum = 0;
25         last = 1;
26         for(i=1; i<=num; i++)
27         {
28             scanf("%d",a+i);
29             sum += a[i];
30             if(sum>max)
31             {
32                 start = last;
33                 max= sum;
34                 end = i;
35             }
36             if(sum<0)
37             {
38                 sum = 0;
39                 last = i+1;
40             }
41 
42         }
43         printf("Case %d:\n",flag);
44         printf("%d %d %d\n",max,start,end);
45         if(flag<temp)
46             printf("\n");
47         flag++;
48     }
49     while(1);
50     return 0;
51 }

 

目录
相关文章
HDU 2669 Romantic
题意:找出最小的非负整数X,使之满足式子X*a + Y*b = 1。
113 0
|
Java 人工智能
|
Java BI
HDU 1412 {A} + {B}
{A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19833    Accepted Submission(s): 8245 Problem Description 给你两个集合,要求{A} + {B}.
841 0
|
人工智能