lsmCC 发表于 2024-2-7 17:51:09

求长度为k的子序列的最大值,为什么我的代码不对,感觉没问题

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    int n,k;
    cin>>n>>k;
    queue<int>q;
    int sum=0,res=-1e9;
    for(int i=1;i<=n;i++)
    {
      int x;
      cin>>x;
      q.push(x);
      if(q.size()==k)
      {
            while(k--)
            {
                sum+=q.front();   
            }
            q.pop();
      }
      if(sum>res)
      {
            res=sum;
      }
    }
    cout<<res<<endl;
}
// 1 2 3 4
// 123

FishC 发表于 2024-2-7 17:51:23

你的代码中有一处逻辑错误:在计算子序列和sum时,没有将sum重新置为0。因此,每次计算的都是整个序列的和,而不是长度为k的子序列的和。

以下是修正后的代码:

#include <iostream>
#include <queue>
using namespace std;

#define int long long

signed main()
{
    int n, k;
    cin >> n >> k;
    queue<int> q;
    int sum = 0, res = -1e9;
    for (int i = 1; i <= n; i++)
    {
      int x;
      cin >> x;
      q.push(x);
      sum += x;
      if (q.size() > k)
      {
            sum -= q.front();
            q.pop();
      }
      if (q.size() == k && sum > res)
      {
            res = sum;
      }
    }
    cout << res << endl;
    return 0;
}

修正后的代码中,在每次循环中,先将当前元素x加入sum中,然后判断队列q的大小是否大于k。如果大于k,则需要将队首元素从sum中减去,并将其从队列中弹出。这样可以保证sum始终表示长度为k的子序列的和。最后,如果sum大于之前记录的最大值res,则更新res的值。

希望对你有所帮助!如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

zhangjinxuan 发表于 2024-2-7 18:21:44

本帖最后由 zhangjinxuan 于 2024-2-7 18:25 编辑

你只会对于 q.front 的元素进行统计,没有统计 q 所有的元素,还有你这个 k-- 直接就把 k 的值改变了。可以考虑使用支持随机访问的容器,例如 deque。

再注意一下 deque 与 queue 的区别,以及 sum 的清空就可以了:

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    int n,k;
    cin>>n>>k;
    deque<int>q;
    int sum=0,res=-1e9;
    for(int i=1;i<=n;i++)
    {
      int x;
      cin>>x;
      q.push_back(x);
      if(q.size()==k)
      {
              sum = 0;
            for(int i=0;i<k;++i)
            {
                                sum+=q;
                        }
            q.pop_front();
                        if(sum>res)
                        {
                          res=sum;
                        }
      }
    }
    cout<<res<<endl;
}

请注意代码的时间复杂度是 O(nk) 的,如果无法通过本题可以使用一个变量 sum 维护 q 中所有的元素,减少了大部分不必要的访问与求和操作。

如果无法通过,可以使用以下代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    int n,k;
    cin>>n>>k;
    int a;
    int sum=0,res=-1e18;
    for(int i=1;i<=n;i++)
    {
      cin>>a;
      sum+=a;
      if(i>=k)
      {
                        if(sum>res)
                        {
                          res=sum;
                        }
                        sum-=a;
      }
    }
    cout<<res<<endl;
}
页: [1]
查看完整版本: 求长度为k的子序列的最大值,为什么我的代码不对,感觉没问题