题目大致意思是求最大连续子序列的和,并输出求得序列的首尾元素,输出要求1:当有并列的最大和序列时输出最小的那一组值。2:当该序列全为零时输出0,0。3:只有负数和零,则输出总序列的首尾元素。
采用在线更新的方法去解决,即发现当前的和为负数则舍弃并取下一个数为序列首元素,并且比较当前的和与最大和的大小。
#include<bits/stdc++.h>
#define maxsize 100
#define mmax 100005
using namespace std;
int maxsum=0,nsum,beg,k,last,temp=99;//99为任意取的值
int a[mmax];
bool flag=true;
void sc(int *a,int n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(!a[i])
temp=0;
}
}
int main()
{
while(~scanf("%d",&k))
{
sc(a,k);
int cnt=a[0];
for(int i=0;i<k;i++)
{
nsum+=a[i];
if(a[i]>0)
flag=false;
if(nsum>maxsum)//更新最大值
{
maxsum=nsum;
last=a[i];
beg=cnt;
}
if(nsum<0)//更新序列
{
nsum=0;
cnt=a[i+1];
}
}
if(flag)//判断序列是否只有零或负数
{
if(temp)//零或负数
{
beg=a[0];
last=a[k-1];
}
else//只有零
{
beg=0;
last=0;
}
maxsum=0;
}
printf("%d %d %d\n",maxsum,beg,last);
maxsum=0,beg=0,last=0,nsum=0,flag=true,temp=99;
}
return 0;
}