Trp_Cys 2023-03-19 00:07 采纳率: 58.6%
浏览 25
已结题

C++ PAT甲级 最大连续子序列和

原题链接https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805514284679168
题目大意: 有一个数字序列 a1,..., an, 求i, j (1 <= i <= j <= n), 使得ai + ... + aj最大,输出最大和和ai, aj。 若所有的数均小于0, 则认为最大和为0,输出首尾元素。若有多种方案,输出i, j最小的一组。

问题

    if (flag == false) 
    {
        printf("0 %lld %lld\n",arr[0],arr[k - 1]);
        return 0;
    }

为什么删去其中的return 0; 有的用例就不能通过呢?

以下是完整代码:

#include<cstdio>
const int MAX = 10001;
typedef long long LL;
LL arr[MAX], dp[MAX], indexArr[MAX] = {0};

int main()
{
    LL k;
    bool flag = false;
    scanf("%lld", &k);
    for (int i = 0; i < k; i++)
    {
        scanf("%lld", &arr[i]);
        if (arr[i] >= 0) flag = true;
    }
    
    if (flag == false) 
    {
        printf("0 %lld %lld\n",arr[0],arr[k - 1]);
        return 0;
    }
    
    dp[0] = arr[0];
    for (LL i = 1; i < k; i++)
    {
        LL sum = dp[i - 1] + arr[i];
        if (sum > arr[i])
        {
            dp[i] = sum;
            indexArr[i] = indexArr[i - 1];
        }
        else
        {
            dp[i] = arr[i];
            indexArr[i] = i;
        }
    }
    
    LL indexNum = 0;
    for (LL i = 1; i < k; i++)
    {
        if (dp[i] > dp[indexNum])
        {
            indexNum = i;
        }
    }
    
    printf("%lld %lld %lld\n", dp[indexNum], arr[indexArr[indexNum]], arr[indexNum]);
    
    return 0;
}

img

  • 写回答

1条回答 默认 最新

  • threenewbee 2023-03-19 01:32
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 已采纳回答 5月9日
  • 创建了问题 3月19日