【问题标题】:Minimum sum of the difference of k pairwise elementsk个成对元素之差的最小和
【发布时间】:2013-10-19 14:42:36
【问题描述】:

我想计算一个大小为 n 且 k

例如:n = 7 k = 3 10 100 300 200 1000 20 30

我将首先对数字进行排序。 10 20 30 100 200 300 1000 根据我的算法: n!=k 所以首先我会取 10 20 30: 这意味着 diff = 40 像这样继续下去,40 是我得到的最小值。

我想知道是否有比这更好的方法:

这是我的算法:

if(n!=k)
{
 for(i = 0 ;i < n - k;i++)
 {
   diff = 0;
   l = 0;
   for(j = i;j < i + k;j++)
   {
       diff += (a[j] * l - a[j] *(k-l-1));
       if(min < diff)
           break;
       l++;
   }
   if(j == i + k && diff > 0)
       min = diff;
   //cout<<"after: "<<min<<endl; 

 }
}
else
{
    if(k == 1)
      min = a[0];
    else 
    {
        diff = 0;
        for(i = n - 1; i >= 0; i--)
        {
            diff+=a[i]*i - a[i]*(n-i-1);
        }
        min = diff;
    }

}
cout<<min<<endl;

类似这个问题:Finding sum of Absolute Difference of Every pair of integer from an array

不是每一对,取决于 k。

【问题讨论】:

  • 请更具体地说明“绝对差异总和”的含义。究竟有什么区别?成对不同的元素? diff += (a[j] * l - a[j] *(k-l-1)) 不是一个绝对的和,也不清楚你拿的是什么区别。
  • 真的很抱歉。是的,我的意思是成对不同的元素。数组已排序。所以 diff 不会是负数。所以对于 6 3 1 2 4 是数组,排序后它将是 1 2 3 4 6。如果 k = 3 那么 (2 - 1) + (3 - 1) + (3 - 2) = 4
  • 如果你希望别人改进你的代码,你需要解释它。例如,您需要显示算法的推导。 (您在幕后进行了一些重要的代数操作以提出a[j] * i - a[j] * (k-i-1),有人会认为他们使用了与您相同的秘密代数公式,然后意识到它与您的k=1 的代码不匹配并假设他们猜到了不正确。)此外,改进已经运行的代码的建议属于 codereview.stackexchange.com,而不是 stackoverflow.com。
  • 我做了一些修改。我希望现在很清楚,
  • 为了更好地适应问答模型,我建议您将您的方法与问题分开并将其发布为答案(如果没有人提出更好的解决方案,您可以接受)(并且最好用高级描述和/或伪代码添加/替换它,并做一个完整的例子,而不是说“像这样继续”)。除非您希望人们对您的代码提出改进建议(而不是完全不同的方法),在这种情况下,这属于 Code Review

标签: c++ algorithm


【解决方案1】:

我不确定我是否正确理解了您的问题,但它似乎与链接的算法相同,但您可以按值传递给不同 k 值的函数,该函数将根据传入的 k 值对向量进行排序. 见下文。

#include <vector>
#include <iostream>
#include <algorithm>

int absDiffSum( std::vector<int> v, int k )
{
  std::sort(v.begin(), v.begin() + k);

  int n=(v.begin() + k) - v.begin();
  if ( n < 2 )
    return 0;

  int sum = 0;
  for ( int i = 0; i < n; ++i )
  {
    int k = n - i - 1;
    sum+=(v[i]*i - v[i]*k);
  }

  return sum;
}


int main ()
{
  std::vector<int> v = { 2, 3, 5, 7 };

  std::cout << (3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) << std::endl;
  std::cout << absDiffSum( v, 4 ) << std::endl;;

  std::cout << (3-2) + (5-2) + (5-3) << std::endl;
  std::cout << absDiffSum( v, 3 ) << std::endl;;

  std::cout << (3-2) << std::endl;
  std::cout << absDiffSum( v, 2 ) << std::endl;;
}

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多