对HDU1003的总结(借鉴他人)

    首先自己去做的时候,思考的过于复杂,一些想法不敢用上,实际上我们就是要充分运用计算机的特性,做一些人做起来慢的事情。   

Steps 1:    用循环的方式,前1到n项和都可以累计出来.

Steps 2: 使用条件语句来找出最大值,同时可以找出起始和结束位置。

求子序列的最大值和起始位置和结束位置

http://acm.hdu.edu.cn/showproblem.php?pid=1003

#include<stdio.h>

#include<string.h>

 

int main()

{

   int T, N;

   int t, i;

   int a[100001];

   scanf("%d", &T);

   for(t = 0; t < T; t++)

    {

 

           scanf("%d", &N);

           for(i = 0; i < N; i++)

                scanf("%d",&a[i]);

           int maxSum = a[0];

           int sum = 0, l=0, r=0;

           int tmpL = 0;

           for(i = 0; i < N; i++)

           {

                sum += a[i];

                if(sum > maxSum)

                {

                    maxSum = sum;//巧妙的记录了循环过程中出现的最大值。

                    l = tmpL;

                    r = i;

                }

                if(sum < 0)//a:若序列为负时,只需找出哪一项相对最大即可,将sum重置为0则可以巧妙的找出最大项了,同时便可以把初始和结束位置一起找出来。 

                                  b:先正后变负,正时tmpl不产生变化,r为右边界,sum变负时,tmpl变成i+1,接着sum重置,

               {

                    sum = 0;

                    tmpL = i+1;

                }

           }

           printf("Case %d:\n", t+1);

           printf("%d %d %d\n", maxSum, l+1, r+1);

           if(t < T-1)

                printf("\n");

       }

       return 0}

                                                   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值