lsmCC 发表于 2024-2-6 21:12:37

求一个数组子序列的最大值并输出起始位置

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a;
int cnt;
int res=-1e9;
void solve()
{
    int n;
    cin>>n;
    cout<<n<<endl;
    for(int i=1;i<=n;i++)cin>>a;
    int sum=0;
    int i,j;
    for(i=1,j=2;i<=n,j<=n;i++)
    {
      sum+=a;
      while(i<=j)
      {
            if(sum>res)
            {
                res=sum;
                sum+=a;
            }
            j++;
      }
      j=i+1;
    }
    cout<<sum<<endl;
    cout<<i<<" "<<j;
   
}
int main()
{
    int t;
    t=1;
    while(t--)
    {
      solve();
    }
}为什么我的代码不对,并给出正确代码

FishC 发表于 2024-2-6 21:12:56

以下是一个示例代码,用于求解数组子序列的最大值以及输出起始位置:

#include <iostream>
using namespace std;

const int N = 1e5 + 5;

int main()
{
    int n;
    cin >> n;
   
    int a;
    for (int i = 0; i < n; i++) {
      cin >> a;
    }
   
    int start = 0;
    int maxSum = a;
    int currentStart = 0;
    int currentSum = a;
   
    for (int i = 1; i < n; i++) {
      if (currentSum < 0) { // 如果当前子序列的和小于0,则将起始位置和当前和重新设置
            currentStart = i;
            currentSum = a;
      } else { // 如果当前子序列的和大于等于0,则将当前和累加
            currentSum += a;
      }
      
      if (currentSum >= maxSum) { // 如果当前子序列的和大于等于最大和,则更新最大和和起始位置
            maxSum = currentSum;
            start = currentStart;
      }
    }
   
    cout << "最大值为:" << maxSum << endl;
    cout << "起始位置为:" << start << endl;
   
    return 0;
}

在这段代码中,我们使用start变量记录最大子序列的起始位置,maxSum变量记录最大子序列的和。currentStart变量记录当前子序列的起始位置,currentSum变量记录当前子序列的和。

我们遍历数组,如果当前子序列的和小于0,则将起始位置和当前和重新设置;如果当前子序列的和大于等于0,则将当前和累加。

在每次更新最大和时,同时也更新起始位置。

最后输出最大值和起始位置即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求一个数组子序列的最大值并输出起始位置