zoukankan      html  css  js  c++  java
  • HDOJ_ACM_Max Sum

    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
     
    Code
    two programs are all accepted.
    View Code
     1 //input, then two for, record begin, end and the max
     2 #include <stdio.h>
     3 #define N 100000
     4 int f[N + 5];
     5 int main()
     6 {
     7     int T, n, i, j, k, t, begin, end, max, sum;
     8     scanf("%d", &T);
     9     for (k = 1; k <= T; k++)
    10     {
    11         //input
    12         scanf("%d", &n);
    13         for (t = 0; t < n; t++)
    14             scanf("%d", &f[t]);
    15         //find the result
    16         for (max = -1001, begin = 0, i = 0; i < n; i++)
    17         {
    18             for (sum = 0, j = i; j < n; j++)
    19             {
    20                 sum += f[j];
    21                 //if sum is bigger than max, then record.
    22                 if (sum > max)
    23                 {
    24                     begin = i;
    25                     end = j;
    26                     max = sum;
    27                 }
    28                 //if sum is smaller than zero, then jump to j. ★
    29                 if (sum < 0)
    30                 {
    31                     i = j;
    32                     break;
    33                 }
    34             }
    35         }
    36         //formatting printing
    37         printf("Case %d:\n", k);
    38         printf("%d %d %d\n", max, begin + 1, end + 1);
    39         if (k != T)
    40             puts("");
    41     }
    42     return 0;
    43 }
    View Code
     1 //input, then two for, record begin, end and the max
     2 #include <stdio.h>
     3 #define N 100000
     4 int f[N + 5];
     5 int main()
     6 {
     7     int T, n, i, j, k, t, begin, end, max, sum, flag;
     8     scanf("%d", &T);
     9     for (k = 1; k <= T; k++)
    10     {
    11         flag = 0;
    12         //input
    13         scanf("%d", &n);
    14         for (t = 0; t < n; t++)
    15         {
    16             scanf("%d", &f[t]);
    17             if (f[t] > 0)
    18                 flag = 1;
    19         }
    20         max = -1001;
    21         begin = 0;
    22         //if flag is equal to zero which means the all number is small than zero
    23         if (flag == 0)
    24         {
    25             for (i = 0; i < n; i++)
    26             {
    27                 if (f[i] > max)
    28                 {
    29                     max = f[i];
    30                     begin = i;
    31                     end = i;
    32                 }
    33             }
    34         }
    35         else 
    36         {
    37             for (i = 0; i < n; i++)
    38             {
    39                 sum = 0;
    40                 //if the begin number is small than zero, then jump.
    41                 if (f[i] < 0)
    42                     continue;
    43                 for (j = i; j < n; j++)
    44                 {
    45                     sum += f[j];
    46                     //if sum is small than zero, then jump.
    47                     if (sum < 0)
    48                         break;
    49                     if (sum > max)
    50                     {
    51                         begin = i;
    52                         end = j;
    53                         max = sum;
    54                     }
    55                 }
    56             }
    57         }
    58         printf("Case %d:\n", k);
    59         printf("%d %d %d\n", max, begin + 1, end + 1);
    60         if (k != T)
    61             puts("");
    62     }
    63     return 0;
    64 }

    The first one

    for example, 4 4 -5 1 2. when i = 1, j = 2, then sum = 4 + -5 = -1, then make i = j = 2. Because the sum of the before number is samller than zero, you can start with postive interger.

    The second one

    the program judge whether all number is  negative, when it is negative, just find the max number and the position. Besides, when it begin with negative number, you can jump.

    Note the two programs is different.

     
  • 相关阅读:
    线程同步的三种方式(Mutex,Event,Critical Section) 沧海
    VC++多线程下内存操作的优化 沧海
    C++内存对象大会战 沧海
    技术关注:搜索引擎经验 沧海
    jira 3.13.5版 安装 配置 用户权限控制 拂晓风起
    C++ int string 转换 拂晓风起
    C++调用C链接库会出现的问题 拂晓风起
    Windows Server 2003 IIS Service Unavailable 问题解决 拂晓风起
    研究 学术 开发 的好用工具(不包括常见的) 拂晓风起
    SGMarks 问世 (Firefox扩展Gmarks的扩展版) 纯属学习 拂晓风起
  • 原文地址:https://www.cnblogs.com/chuanlong/p/2767137.html
Copyright © 2011-2022 走看看