鱼C论坛

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

[已解决]求解,可以说详细一点吗,不是很理解

[复制链接]
发表于 2023-11-13 23:33:44 | 显示全部楼层 |阅读模式
5鱼币
1
6 1 3
0 3 -2 5 -4 -4
  1. //给定数组a和整数k,q,a有多少个长度至少为k的连续子数组,其中的元素均不超过q
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int main()
  5. {
  6.     int t;
  7.     cin>>t;
  8.     while(t--)
  9.     {
  10.         int n,k,q;
  11.         cin>>n>>k>>q;
  12.         vector<int>a(n);
  13.         for(int j=0;j<n;j++)
  14.         {
  15.             cin>>a[j];
  16.         }
  17.         vector<int>p;
  18.         p.push_back(-1);
  19.         for(int j=0;j<n;j++)  //按照q来分割,那么把大于q的位置都找出来,以坐标为分割线,第一次学到
  20.         {
  21.             if(a[j]>q)
  22.             {
  23.                 p.push_back(j);
  24.             }
  25.         }
  26.         p.push_back(n);  //将小于那部分也包含进去了,也就是没有一个
  27.         int m=p.size();
  28.         long long ans=0;
  29.         for(int j=0;j<m-1;j++) //分成若干个区间
  30.         {
  31.             int d=p[j+1]-p[j];
  32.             cout<<d<<endl;
  33.             if(d>=k)
  34.             {
  35.                 ans+=(long long )(d-k+1)*(d-k)/2;
  36.             }
  37.         }
  38.         cout<<ans<<endl;

  39.     }
  40. }
  41. /*
  42. 这段代码的目的是计算给定数组 a 和整数 k、q 的情况下,有多少个长度至少为 k 的连续子数组,其中的元素均不超过 q。

  43. - 将 -1 存入向量 p 中的目的是确保在后面的循环中,第一个子数组的起始位置正确。因为 -1 不会出现在原始数组 a 中,所以将其作为起始位置。

  44. - 将数组的长度 n 存入向量 p 中的目的是确保最后一个子数组的结束位置正确。将 n 添加到 p 的末尾,表示最后一个子数组的结束位置。

  45. - int d = p[j+1] - p[j]; 这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。通过计算 p[j+1] 和 p[j] 的差值,可以得到连续子数组的长度。

  46. - if (d >= k) 这个条件判断是否满足最小长度要求 k。如果满足条件,说明当前连续子数组的长度大于等于 k。

  47. 总结一下,将 -1 和 n 存入向量 p 是为了确保第一个子数组和最后一个子数组的起始位置和结束位置正确。而计算 p[j+1] - p[j] 的差值则是为了得到连续子数组的长度。

  48. 希望可以解答您的疑问,如果还有其他问题,请随时提问。*/
复制代码

5是大于3的那么左边连续子数组长度不是为3,可是d为什么是4呢
最佳答案
2023-11-13 23:33:45
在这段代码中,当计算连续子数组的长度时,使用的是 int d = p[j+1] - p[j] 这行代码。这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。在给定的例子中,5是大于3的,因此它会被当作一个分割点。所以在这个例子中,p[j]代表的是3,p[j+1]代表的是5,因此 d = p[j+1] - p[j] = 5 - 3 = 2 ,而不是4。所以在这个例子中,d应该是2而不是4。希望这能解答您的疑问。

最佳答案

查看完整内容

在这段代码中,当计算连续子数组的长度时,使用的是 int d = p[j+1] - p[j] 这行代码。这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。在给定的例子中,5是大于3的,因此它会被当作一个分割点。所以在这个例子中,p[j]代表的是3,p[j+1]代表的是5,因此 d = p[j+1] - p[j] = 5 - 3 = 2 ,而不是4。所以在这个例子中,d应该是2而不是4。希望这能解答您的疑问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-13 23:33:45 | 显示全部楼层    本楼为最佳答案   
在这段代码中,当计算连续子数组的长度时,使用的是 int d = p[j+1] - p[j] 这行代码。这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。在给定的例子中,5是大于3的,因此它会被当作一个分割点。所以在这个例子中,p[j]代表的是3,p[j+1]代表的是5,因此 d = p[j+1] - p[j] = 5 - 3 = 2 ,而不是4。所以在这个例子中,d应该是2而不是4。希望这能解答您的疑问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-13 23:35:54 | 显示全部楼层
根据代码中的逻辑,变量d表示相邻元素之间的差值,即表示连续子数组的长度。在这段代码中,d的计算方式是通过计算p[j+1]和p[j]的差值得到的。

在给定的数组a中,如果元素大于q,则将该位置的索引j存入向量p中。而向量p中的元素表示大于q的位置的分割线,用来划分连续子数组。最后,将数组的长度n也加入到向量p的末尾,表示最后一个子数组的结束位置。

所以,对于给定的数组[0, 3, -2, 5, -4, -4]和元素不超过3的条件,根据代码中的逻辑,向量p的值为[-1, 1, 3, 6]。其中,p[1]-p[0]表示第一个子数组的长度,为1-(-1)=2;p[2]-p[1]表示第二个子数组的长度,为3-1=2;p[3]-p[2]表示第三个子数组的长度,为6-3=3。

所以,对于这个数组,d的计算结果为[2, 2, 3]。其中,第一个d=2表示左边连续子数组的长度为2,并不满足长度至少为k的要求。因此,前面的输出结果为2。

希望以上解释能够帮助您理解代码的逻辑。如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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