求长度为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 你的代码中有一处逻辑错误:在计算子序列和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: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]