鱼C论坛

 找回密码
 立即注册
查看: 434|回复: 2

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

[复制链接]
发表于 2024-2-7 17:51:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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
// 1  2  3  

评分

参与人数 1荣誉 +1 收起 理由
zhangjinxuan + 1 问题解决后,请设置最佳答案。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i];
                        }
            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[n+1];
    int sum=0,res=-1e18;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
        if(i>=k)
        {
                        if(sum>res)
                        {
                            res=sum;
                        }
                        sum-=a[i-k+1];
        }
    }
    cout<<res<<endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表