题目链接:点击打开题目
就是一个简单的最大子序列的和,注意对全负数序列的处理,还有包含0的负数序列。
代码如下:
#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1.0)
int main()
{
int n;
int num[10000+5];
bool isAllNotPositive = true;
bool isHaveZero = false;
cin >> n;
for (int i = 1 ; i <= n ; i++)
{
scanf ("%d",&num[i]);
if (num[i] > 0)
isAllNotPositive = false;
if (num[i] == 0)
isHaveZero = true;
}
if (isAllNotPositive) //如果都是非正数
{
if (isHaveZero) //先判断0
{
for (int i = 1 ; i <= n ; i++)
{
if (num[i] == 0)
{
printf ("0 %d %d\n",num[i],num[i]);
break;
}
}
}
else //都是负数
{
printf ("0 %d %d\n",num[1],num[n]);
}
return 0;
}
LL sum = 0;
LL MaxSum = 0;
int st,endd,temp_st = 1;
for (int i = 1 ; i <= n ; i++)
{
sum += num[i];
if (sum > MaxSum)
{
st = temp_st;
endd = i;
MaxSum = sum;
}
if (sum < 0)
{
temp_st = i+1;
sum = 0;
}
}
printf ("%lld %d %d\n",MaxSum,num[st],num[endd]);
return 0;
}