记录编号 125600 评测结果 AAAAAAAAAA
题目名称 [福州培训2010] 最大和 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 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;
}