2021年计算机类数据结构作业1
问题 D: 最大连续子序列和问题
题目描述
给定整数序列A1,A2,…,An,对其所有连续子序列求和,寻找累加和最大的序列。如果所有的整数都是负的,那么最大连续子序列的和为0。
输入格式
输入包括多组测试数据,每组测试数据一行,每行第一个为正整数n(0 < n <= 100000),表示序列长度,紧跟着n个整数,Ai (-1001<Ai < 1001),表示序列每个元素,各个整数之间用空格隔开。
输出格式
针对每组测试数据,输出最大连续子序列的和,以及该最大连续子序列的起止位置。当最大连续子序列的长度为0时,序列的起止位置都输出为-1。如果有多个连续子序列的值为最大值,输出第一个连续子序列。
多组输出用换行隔开
输入样例
6 -2 11 -4 13 -5 2
1 -1
输出样例
20 1 3
0 -1 -1
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rg register
#define RP(i,a,b) for(register int i=a;i<=b;++i)
#define DRP(i,a,b) for(register int i=a;i>=b;--i)
#define fre(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout)
#define ll long long
#define mod 998244353
//#define lll long long
//#define lll __int128
int main()
{
std::ios::sync_with_stdio(false);
int n;
while(cin>>n)
{
int arr[n+1];
int num=0;
for(int i=0;i<n;i++)
{
cin>>arr[i];
if(arr[i]<0)
{
num++;
}
}
if(num==n)
{
cout<<0<<" "<<"-1 -1"<<endl;
continue;
}
int maxs=arr[0];
int sumi=0;
int a=0,b=0,temp=0;
for(int i=0;i<n;i++)
{
sumi+=arr[i];
if(sumi>maxs)
{
maxs=sumi;
b=a;
temp=i;
}
if(