当前位置:   article > 正文

C++求小和问题_求数列的小和c++

求数列的小和c++

一个数组每个数左边比它大的数进行相加,遍历完数组即为小和

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int merge(vector<int>& s, int l, int mid, int r) {
  5. int p1 = l;
  6. int p2 = mid + 1;
  7. int i = 0;
  8. int res = 0;
  9. vector<int> help(r - l + 1);
  10. while (p1 <= mid && p2 <= r) {
  11. res += s[p1] < s[p2] ? s[p1] * (r - p2 + 1) : 0;
  12. help[i++] = s[p1] <= s[p2] ? s[p1++] : s[p2++];
  13. }
  14. while (p1 <= mid) {
  15. help[i++] = s[p1++];
  16. }
  17. while (p2 <= r) {
  18. help[i++] = s[p2++];
  19. }
  20. for (i = 0; i < r - l + 1; i++) {
  21. s[l + i] = help[i];
  22. }
  23. return res;
  24. }
  25. int smallSum(vector<int>& s, int l, int r) {
  26. if (l == r) {
  27. return 0;
  28. }
  29. int mid = l + (r - l) / 2;
  30. return smallSum(s, l, mid) + smallSum(s, mid + 1, r) + merge(s, l, mid, r);
  31. }
  32. int main() {
  33. vector<int> s = {1, 2, 3, 4};
  34. cout << smallSum(s, 0, s.size() - 1);
  35. }

过程为计算每个数的右边有几个数比它大,该数乘以数量即为该数的小和

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/227452
推荐阅读
相关标签
  

闽ICP备14008679号