蚂蚁的难题(二)

蚂蚁的难题(二)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

下雨了,下雨了,蚂蚁搬家了。

已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈。小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材。因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材。时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大。

输入
有多组测试数据(以EOF结尾)。
每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈。(1 <= n<= 50000)
第二行分别有n个数,代表蚂蚁对第n种食材的喜爱值Vi。(-10^9 <= Vi <= 10^9)
输出
输出小蚂蚁能够搬走的食材的喜爱值总和的最大。
样例输入
3
3 -1 2
5
-8 5 -1 3 -9
样例输出
5
7

我的代码,服务器过不了:

#include<stdio.h>
#include<string.h>
__int64 a[50010];
__int64 data1[50010];
__int64 data2[50010];
inline __int64 max(__int64 x,__int64 y)
{return x>y?x:y;}
inline __int64 min(__int64 x1,__int64 y1)
{return x1<y1?x1:y1;}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
    int i;
    memset(a,0,sizeof(a));
    __int64 sum=0;
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        sum=sum+a[i];
    }

    data1[1]=a[1];
    for(i=2;i<=n;i++)
    {
    data1[i]=max(data1[i-1]+a[i],a[i]);
    }
    __int64 maxx=a[1];
    for(i=2;i<=n;i++)
    {

        maxx=max(data1[i],maxx);
    }

    data2[1]=a[1];
    for(i=2;i<=n;i++)
    {
    data2[i]=min(data2[i-1]+a[i],a[i]);
    }
    __int64 minn=a[1];
    for(i=2;i<=n;i++)
    {

        minn=min(data2[i],minn);
    }
    
    printf("%lld\n",max(sum-minn,maxx) );
    }
    return 0;
}

优秀代码:

 #include<stdio.h>
typedef long long LL;
inline LL max(LL a, LL b)
{
    return a>b?a:b;
}
inline LL min(LL a,LL b){
    return a<b?a:b;
}
int main()
{
    int N;
    int i;
    LL s1, s2, m1, m2, t, s;
    while(~scanf("%d",&N)){
        scanf("%lld",&t);
        s1 = s2 = m1 = m2 = s = t;
        for( i = 1; i < N; i++)
        {
            scanf("%lld",&t);
            s += t;
            if(s1+t > t)   s1 = s1+t;
            else s1 = t;
            m1 = max(s1, m1);
            if(s2+t < t)    s2 = s2+t;
            else s2 = t;
            m2 = min(m2, s2);
        }
        printf("%lld\n",max(m1,s - m2));
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值