记录编号 |
125600 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[福州培训2010] 最大和 |
最终得分 |
100 |
用户昵称 |
水中音 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.049 s |
提交时间 |
2014-10-09 16:39:34 |
内存使用 |
0.70 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[100010]={0},f=0,g=0,zj1,i,zui_max=0,zui_min=0x7fffffff,sum=0;
int main()
{
freopen("maxsum.in","r",stdin);
freopen("maxsum.out","w",stdout);
scanf("%d",&n);
scanf("%d",&a[1]);//先确定第一位数字,便于合并
sum=a[1];
for(i=2;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];//求和
if(a[i]*a[i-1]>0)//假如数字符号与前一位相同,则可以合并
{
a[i-1]+=a[i];//合并
i--;//因为合并所以n-1并且i-1
n--;
}
}
//合并后数字正负交替
for(i=1;i<=n;i++)
{
zj1=f+a[i];//f记录sum不为0的某一区间的和
if(zj1>0) f=zj1;//f不负责记录最大值
else f=0;//假如出现负数,则此时数字为负数
if(f>zui_max)zui_max=f;//记录正数的最大值
zj1=g+a[i];//规则相同,求出区间最小值
if(zj1<0) g=zj1;
else g=0;
if(g<zui_min)zui_min=g;
}
zj1=sum-zui_min;//两种情况,其一为正数和最大,其二为总和减去最小值最大
if(zui_max<zj1)zui_max=zj1;
printf("%d\n",zui_max);
return 0;
}