zoukankan      html  css  js  c++  java
  • HDU 1003 HDU1231 Max Sum

    HDU 1003 :                                                                                Max Sum   

    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

    解题报告:

    此题为求每一个子段的最大的和,求出该子段起始位置,最末一个元素的位置,由于测试数据为1<=N<=100000,所以采取双重循环,分别求每一个子段的和,然后再相互比较,则很显然会TLE,所以双重循环式行不通的,只能考虑更为简单的方法。

    可以这样考虑,如果一个<0的数加上一个数a,那么它的和肯定<a。如果a的值比开始所求得的max大,则就将起始位置e设置为a的位置。只要和比max大,则将此位置的行号赋给末尾位置,这样就是单重循环,不会TLE;

    解此题的过程中间,出现了问题,就是通过比较第k+1个数的值>第k个的值,才使起始位置的值更新,花费很长时间举个例子 100 -101 2才发现错误。就是判断是否或在哪更新起始位置稍微有些问题。下面是AC代码:

    #include<stdio.h>
    int main()
    {
    int n,m,max,s,a,k,temp,j=1,e,t;
    scanf("%d",&n);
    while(1)
    {
    scanf("%d",&m);
    s=0;
    t=1;
    temp=1;
    max=-100001;
    for(k=1;k<=m;k++)
    {
    scanf("%d",&a);

    s+=a;
    if(s<a)//判断大小,若成立,则说明s<0;
    {
    t=k; //先将此位置的值赋予t
    s=a; //初始值a赋予s
    }
    if(s>max) //判断是否>最大值
    {
    e=t; // 此时只有这个条件成立时,才将t的值赋予初始值e
    max=s;
    temp=k; //满足s>max,即将k的值赋予末尾位置
    }

    }
    printf("Case %d:\n%d %d %d\n",j,max,e,temp);
    if(j!=n)printf("\n"); //控制格式
    j++;
    if(j==n+1)break; //跳出循环
    }
    return 0;
    }

     HDU 1231同这题,差不多,AC代码:

    #include<stdio.h>
    int main()
    {
    int a[10001],i,max,p,temp,begin,end,s,n;
    while(1)
    {
    p=0;
    max=-100000;
    scanf("%d",&n);
    if(n==0)break;
    for(i=0;i<n;i++)
    {
    scanf("%d",&a[i]);
    if(a[i]>=0)p=1;
    }
    if(p==1)
    {
    s=0;
    begin=a[0];
    end=a[0];
    temp=a[0];
    for(i=0;i<n;i++)
    {
    s+=a[i];
    if(s<a[i])
    {
    temp=a[i];
    s=a[i];
    }
    if(s>max)
    {
    begin=temp;
    end=a[i];
    max=s;
    }
    }
    }
    else
    {
    begin=a[0];
    end=a[n-1];
    max=0;
    }
    printf("%d %d %d\n",max,begin,end);

    }
    return 0;
    }



  • 相关阅读:
    scrapy下载图片第一波
    scrapy之防ban策略
    xml之dtd约束
    Java jdbc相关
    XSS获取cookie
    反射型XSS & DVWA
    MySQL数据库设计规范
    SQL Server 查询指定时间是一年当中的第几周
    js验证15位或18位身份证
    C# Process.Start()
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2393243.html
Copyright © 2011-2022 走看看