我需要计算整数数组的函数。对于数组的每个三元素子集(或三元组),我需要计算术语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;
}
是否有任何更好的优化提示?
答案 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);
}
}
}