Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化C+中的三重态求和+; 问题_C++_Sum_Triplet - Fatal编程技术网

C++ 优化C+中的三重态求和+; 问题

C++ 优化C+中的三重态求和+; 问题,c++,sum,triplet,C++,Sum,Triplet,我需要计算一个整数数组的函数。对于数组的每个三元素子集(或三元组),我需要计算术语floor((三元组之和)/(三元组之积))。然后我需要返回所有这些条件的总和 例子 输入(长度;数组): 输出: 6 解释 给定数组中存在以下三元组: 1 2 1 1 2 7 1 2 3 117 1 13 1 7 3 21 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 17有助于1

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

例子 输入(长度;数组):

输出:

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

1 2 1

1 2 7

1 2 3

117

1 13

1 7 3

21 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 17有助于1

1 13有助于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;
}
#包括
#包括
使用名称空间std;
int main()
{
长t,n[300005],和=0,mul=1,i,j,k,res=0;
cin>>t;
对于(i=0;i>n[i];
对于(i=0;i仍为O(n^3),可以通过在迭代
n[k]
时缓存
n[i]
n[j]
之间的冗余计算来保存一些操作

例如:

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);
    }
  }
}
long sum_ij,mul_ij;

对于(i=0;ii)如果您想更好地改进工作代码,请询问。将i每次增加3个步骤如何?您只需要一个for循环。类似的方法应该可以工作
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);
    }
  }
}