鱼C论坛

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

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

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

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

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

x
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. signed main()
  5. {
  6.     int n,k;
  7.     cin>>n>>k;
  8.     queue<int>q;
  9.     int sum=0,res=-1e9;
  10.     for(int i=1;i<=n;i++)
  11.     {
  12.         int x;
  13.         cin>>x;
  14.         q.push(x);
  15.         if(q.size()==k)
  16.         {
  17.             while(k--)
  18.             {
  19.                 sum+=q.front();     
  20.             }
  21.             q.pop();
  22.         }
  23.         if(sum>res)
  24.         {
  25.             res=sum;
  26.         }
  27.     }
  28.     cout<<res<<endl;
  29. }
  30. // 1 2 3 4
  31. // 1  2  3  
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2024-2-7 17:51:23 | 显示全部楼层
你的代码中有一处逻辑错误:在计算子序列和sum时,没有将sum重新置为0。因此,每次计算的都是整个序列的和,而不是长度为k的子序列的和。

以下是修正后的代码:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;

  4. #define int long long

  5. signed main()
  6. {
  7.     int n, k;
  8.     cin >> n >> k;
  9.     queue<int> q;
  10.     int sum = 0, res = -1e9;
  11.     for (int i = 1; i <= n; i++)
  12.     {
  13.         int x;
  14.         cin >> x;
  15.         q.push(x);
  16.         sum += x;
  17.         if (q.size() > k)
  18.         {
  19.             sum -= q.front();
  20.             q.pop();
  21.         }
  22.         if (q.size() == k && sum > res)
  23.         {
  24.             res = sum;
  25.         }
  26.     }
  27.     cout << res << endl;
  28.     return 0;
  29. }
复制代码


修正后的代码中,在每次循环中,先将当前元素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 的清空就可以了:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. signed main()
  5. {
  6.     int n,k;
  7.     cin>>n>>k;
  8.     deque<int>q;
  9.     int sum=0,res=-1e9;
  10.     for(int i=1;i<=n;i++)
  11.     {
  12.         int x;
  13.         cin>>x;
  14.         q.push_back(x);
  15.         if(q.size()==k)
  16.         {
  17.                 sum = 0;
  18.             for(int i=0;i<k;++i)
  19.             {
  20.                                 sum+=q[i];
  21.                         }
  22.             q.pop_front();
  23.                         if(sum>res)
  24.                         {
  25.                             res=sum;
  26.                         }
  27.         }
  28.     }
  29.     cout<<res<<endl;
  30. }
复制代码


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

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. signed main()
  5. {
  6.     int n,k;
  7.     cin>>n>>k;
  8.     int a[n+1];
  9.     int sum=0,res=-1e18;
  10.     for(int i=1;i<=n;i++)
  11.     {
  12.         cin>>a[i];
  13.         sum+=a[i];
  14.         if(i>=k)
  15.         {
  16.                         if(sum>res)
  17.                         {
  18.                             res=sum;
  19.                         }
  20.                         sum-=a[i-k+1];
  21.         }
  22.     }
  23.     cout<<res<<endl;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 05:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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