蚂蚁的难题(二)
-
描述
-
下雨了,下雨了,蚂蚁搬家了。
已知有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
-
有多组测试数据(以EOF结尾)。
我的代码,服务器过不了:
#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;
}