問題
整数の配列の関数を計算する必要があります。配列のすべての 3 要素サブセット (またはトリプレット) について、項 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
サンプル入力からのこれらのトリプレットを考慮してください。
floor((1+2+1)/(1*2*1)) = floor(4/2) = 2 なので、1 2 1 は 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;
}
より良い最適化のヒントはありますか?