给定 K 个整数的序列 {N1N_1N1,N2N_2N2,…,NKN_KNK},其任意连续子序列可表示为 {NiN_iNi,Ni+1N_{i+1}Ni+1,…,NjN_jNj},其中 1≤i≤j≤K。

最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列 {−2,11,−4,13,−5,−2},其最大连续子序列为 {11,−4,13} ,最大和为 20。

编写程序得到其中最大子序列的和并输出该子序列的第一个和最后一个元素的下标。

输入格式
输入包含多组测试数据。

每组数据占 2 行,第 1 行给出正整数 K。

第 2 行给出 K 个整数 N1N_1N1,…,NKN_KNK

输出格式
每组数据输出一行结果,包含最大子序列的和以及子序列的第一个下标 i 和最后一个元素的下标 j。

所有元素下标为 0∼K−1。

如果最大子序列不唯一,则选择 i 最小的那个子序列,如果仍不唯一,则选择 i 最小的子序列中 j 最小的那个子序列。

若所有 K 个元素都是负数,则定义其最大和为 0,输出 0 0 0。

数据范围
1≤K≤10510^5105,
−10000≤NiN_iNi≤10000,
输入最多包含 10 组数据。

输入样例:
8
6 -2 11 -4 13 -5 -2 10
5
10 -10 10 -10 10
8
-1 -5 -2 3 -1 0 -2 0
4
-1 -2 -4 -3

输出样例:
27 0 7
10 0 0
3 3 3
0 0 0

My Answer Code:

/*
	Author:Albert Tesla Wizard
	Time:2021/9/2 17:33
*/
#include<bits/stdc++.h>
using namespace std;
const int N=100010,INF=0x3f3f3f3f;
int n,sum,ans,l,r,ltmp;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>n)
    {
        sum=0,ans=-INF,l=1,r=1,ltmp=1;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        if(sum<0)sum=0,ltmp=i+1;
        if(ans<sum)ans=sum,l=ltmp,r=i;
    }
        if(ans<=0)ans=0,l=1,r=1;
        cout<<ans<<" "<<l-1<<" "<<r-1<<'\n';
    }
    return 0;
}
Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐