HDOJ 1003

题目:求一串数字的和的最大值,并写出这个最大值的开始位置与结束位置。

 

题解:思路一、将所有数字录入后用穷举法求出所有字符串的值一一对比。但是该方法超时。

            思路二、每一个数依次对比,在计算本数前先判断之前的数列最大值是否大于零,

                            大于零的话加上当前数后与最大值比较看新的数列和是否为最大值,

                           小于零的话则从当前数开始求新的数列和!并且与之前的最大值比较后选择数列的开始位置及最值。

 

代码:

#include<stdio.h>
int a[100010];
int main()
{
 int t,n,r,s,i,max,st,en,m;
 while(scanf("%d",&t)!=EOF)
 {
  for(r=1;r<=t;r++)
  {
   scanf("%d",&n);
   for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
   s=max=-99999;     //s表示当前的和max表示最大值先都初始化。
   m=st=en=1;       //st为开始位置,en为结束位置,m为可能成为的开始位置。
   for(i=1;i<=n;i++)
   {
    if(s<0)      //加当前数之前的数列和小于零的话,和"S"直接为当前数,可能的开始位置为当前位置。
    {
     s=a[i];
     m=i;
    }
    else        //加当前数之前的数列和大于等于零的话,和"s"为"s"+当前数,
    {
     s+=a[i];
    }
    if(s>=max)  //当前数列和“s”大于最大值时,改变最大值,将目前位置定义为最终位置,开始位置为m
    {
     max=s;
     en=i;
     st=m;
    }
   }
   printf("Case %d:\n%d %d %d\n",r,max,st,en);
   if(r!=t)
    printf("\n");
  }
 }
 return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值