在C ++中优化三元组求和

时间:2016-10-15 08:17:50

标签: c++ sum triplet

问题

我需要计算整数数组的函数。对于数组的每个三元素子集(或三元组),我需要计算术语floor((三元组的总和)/(三元组的乘积))。然后我需要返回所有这些术语的总和。

实施例

输入(长度;数组):

5
1 2 1 7 3

输出:

6

说明

给定数组中存在以下三元组:

  

1 2 1

     

1 2 7

     

1 2 3

     

1 1 7

     

1 1 3

     

1 7 3

     

2 1 7

     

2 1 3

     

2 7 3

     

1 7 3

从样本输入中考虑这些三元组:

1 2 1贡献2,因为楼层((1 + 2 + 1)/(1 * 2 * 1))=楼层(4/2)= 2

1 2 3贡献1

1 1 7贡献1

1 1 3贡献1

2 1 3贡献1

所有其他三元组对总和贡献0。

因此答案是(2 + 1 + 1 + 1 + 1)= 6.

我的解决方案

我尝试的是复杂度O(n ^ 3)。代码如下:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long t,n[300005],sum=0,mul=1,i,j,k,res=0;
    cin >> t;

    for(i=0;i<t;i++)
        cin >>n[i];


    for(i=0;i<t-2;i++)
    for(j=i+1;j<t-1;j++)
    for(k=j+1;k<t;k++)
    {
        sum = n[i]+n[j]+n[k];
        mul = n[i]*n[j]*n[k];
        res += floor(sum/mul);
    }

    cout << res << endl;
    return 0;
}

是否有任何更好的优化提示?

1 个答案:

答案 0 :(得分:0)

虽然仍为O(n ^ 3),但您可以在迭代n[i]时通过在n[j]n[k]之间缓存冗余计算来保存一些操作。

例如:

long sum_ij,mul_ij;

for(i=0;i<t-2;i++) {
  for(j=i+1;j<t-1;j++) {

    sum_ij = n[i]+n[j];
    mul_ij = n[i]*n[j];

    for(k=j+1;k<t;k++)
    {
       sum = sum_ij+n[k];
       mul = mul_ij*n[k];
       res += floor(sum/mul);
    }
  }
}